将 RequestBody json 转换为对象 - Spring Boot
Posted
技术标签:
【中文标题】将 RequestBody json 转换为对象 - Spring Boot【英文标题】:Converting a RequestBody json to an Object - Spring Boot 【发布时间】:2017-08-23 21:41:20 【问题描述】:我是 Java 开发的初学者,但之前有 php 和 Python 等编程语言的经验。对于如何在 Spring Boot 上进行开发,几乎没有什么困惑。
我正在开发一个具有以下请求的 REST API
"key":"value",
"key1":"value1",
"platform_settings":[
"key":"value"
]
我做了什么
我创建了一个接受 http 请求的 RestController 并为资源创建了一个函数
public Share share(@RequestBody final Share share)
LOGGER.debug("This is the request", share);
return share; //
问题 1:如果是 PHP 或 Python 等其他编程语言,会有辅助函数接受 json 请求并将其转换为我可以轻松处理的对象。
在python中它就像
一样简单import json
import requests
response = requests.get(...)
json_data = json.loads(response.text)
//can work on json_data anyway I want.
但是在 java 中,我必须创建一个 POJO 类,或者将 jackson/JPA 实体作为依赖项,它将请求映射到一个类(我应该用请求预先定义)。
有没有更好的方法可以做到这一点?对于我提出的每个请求,我都必须创建一个可以将请求映射到的类,并且我必须定义类
Entity
package com.payunow.socialsharemodule.models;
import java.util.Map;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Share
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String key;
private String key1;
private Map<String,String> platform_settings;
public Share(String name, String description,Map<String,String> platform_settings)
this.key = key;
this.key1 = key1;
this.platform_settings = platform_settings;
//for JPA
public Share()
public String getKey()
return key;
public String getKey1()
return key1;
public Map<String,String> getPlatform_settings()
return platform_settings;
对于我提出的每个请求,我都必须创建一个类来定义其内部的所有变量。这是唯一的方法吗?
【问题讨论】:
@Japu_D_Cret 这不是重复的。请在发表评论之前阅读我的问题! 它有点是,我链接到的接受的答案使用json-simple
库,它不会强制您为响应创建包装器,您可以处理 JSONArray 和 JSONObject 等对象,然后相应地转换这些对象。但是,如果您的响应每次都是相同的格式,我建议创建一个包装器类一个 Jackson
@Japu_D_Cret 如果您看到这个问题,我的问题是关于处理请求以及我是否应该始终将请求映射到一个类。您的回答与在 J2ME 应用程序中的使用有关,而不是在 springboot 应用程序中
链接了错误的答案,请参阅***.com/questions/1688099/converting-json-to-java,这是使用 json-simple ***.com/questions/30757136/… 转换 JSON 字符串的方法
whether should I always map request to a class or not
如果您想从响应处理中获得最后的性能,那么要么根本不解析 json,要么只使用 json-simple 尽可能多地解析它。如果您想在响应上可靠地工作并拥有一个强类型的对象,这比我建议您花一点时间赤字并将其完全转换为杰克逊等的 POJO 更易于使用。如果你想像使用 Python 一样使用它,json-simple 库非常接近
【参考方案1】:
您需要 Jackson 依赖才能将 json 转换为 java 对象。但是spring默认提供了,所以不用显式添加。
您不需要 JPA 实体。仅当您要将接收到的数据存储到数据库中时才需要这样做。 只需接收请求,您就不必创建单独的 pojo 类。看这段代码
@PostMapping("/json")
public JSONObject getGeneric(@RequestBody String stringToParse)
JSONParser parser = new JSONParser();
JSONObject json = null;
try
json = (JSONObject) parser.parse(stringToParse);
catch (ParseException e)
e.printStackTrace();
return json;
正如您在此处看到的,它将字符串作为请求并将其转换为通用 JSONObject。所以基本上你可以将任何 json 传递给这个端点。
【讨论】:
【参考方案2】:您可以使用 ObjectMapper 类,它具有 convertValue 和 realValue 等方法。
【讨论】:
以上是关于将 RequestBody json 转换为对象 - Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章
@RequestBody 没有将 JSON 映射到 Java 对象 - Spring Boot
JSON处理(一):HTTP请求响应的JSON化 @RequestBody 和 @ResponseBody