从 json post 请求中检索 Java 对象
Retrieving Java Objects from a json post request
我正在使用 java 和 jax-rs 开发 restful 网络应用程序。在服务器端,我必须接受客户端使用 POST 方法给出的 Json 类型的请求。
@POST
@Path("/Request")
@Consumes(MediaType.APPLICATION_JSON)
public String process(SMessage message) throws Exception {
message.getHeader();
message.getBody();
}
json 对象有两个复合字段,格式如下。
{
"header": {
"serviceType": "A"
},
"body": {
"id": "1",
"name": "abc"
}
}
根据Header字段中指定的serviceType,body中的参数会有所不同。我需要将此正文字段映射到 java POJO class。 POJO class 并非对所有请求都相同。我怎样才能有效地做到这一点?
如果您使用 Jackson
作为 JSON 解析器,一个简单的方法是将 body
声明为 JsonNode
来处理动态键,如下所示:
class MyResponse {
private MyHeader header;
private JsonNode body;
//general getters and setters
}
并且我假设您已经为 header
创建了一个 POJO,例如:
class MyHeader {
private String serviceType;
//general getters and setters
}
最后,让我们验证它是否有效:
String responseStr = "{\"header\": {\"serviceType\": \"A\"},\"body\": {\"id\": \"1\",\"name\": \"abc\"}}";
ObjectMapper mapper = new ObjectMapper();
MyResponse myResponse = mapper.readValue(responseStr, MyResponse.class);
System.out.println(myResponse.getBody().get("name").asText());
控制台输出:
abc
解决此问题的另一种方法是使用 Map
,其他一切都相同:
class MyResponse {
private MyHeader header;
private Map<String, Object> body;
//general getters and setters
}
我正在使用 java 和 jax-rs 开发 restful 网络应用程序。在服务器端,我必须接受客户端使用 POST 方法给出的 Json 类型的请求。
@POST
@Path("/Request")
@Consumes(MediaType.APPLICATION_JSON)
public String process(SMessage message) throws Exception {
message.getHeader();
message.getBody();
}
json 对象有两个复合字段,格式如下。
{
"header": {
"serviceType": "A"
},
"body": {
"id": "1",
"name": "abc"
}
}
根据Header字段中指定的serviceType,body中的参数会有所不同。我需要将此正文字段映射到 java POJO class。 POJO class 并非对所有请求都相同。我怎样才能有效地做到这一点?
如果您使用 Jackson
作为 JSON 解析器,一个简单的方法是将 body
声明为 JsonNode
来处理动态键,如下所示:
class MyResponse {
private MyHeader header;
private JsonNode body;
//general getters and setters
}
并且我假设您已经为 header
创建了一个 POJO,例如:
class MyHeader {
private String serviceType;
//general getters and setters
}
最后,让我们验证它是否有效:
String responseStr = "{\"header\": {\"serviceType\": \"A\"},\"body\": {\"id\": \"1\",\"name\": \"abc\"}}";
ObjectMapper mapper = new ObjectMapper();
MyResponse myResponse = mapper.readValue(responseStr, MyResponse.class);
System.out.println(myResponse.getBody().get("name").asText());
控制台输出:
abc
解决此问题的另一种方法是使用 Map
,其他一切都相同:
class MyResponse {
private MyHeader header;
private Map<String, Object> body;
//general getters and setters
}