[英]Nested Mapping In Jackson
我得到一个JSON
字符串作为响应,如下所示
{"size":3,"page-size":3,"subscribers-aircraft":
[
{"company-name":"ATCOMPANYTEST","tailno":"N345","status":"ACTIVE","network-status":"ACTIVE","id":18501,"contact":"SS Theairtime","model":"A-380-800","note":null,"created-at":"Jun 29, 2015 7:42:54 AM","packages":2,"username":"ATAIRCRAFTTEST","external-account":null,"consumer-type":"AIRCRAFT","isp-id":18493,"parent-id":18497,"subscriber-feature-id":13,"status-code":null,"status-msg":null},
{"company-name":"The AIRTIME 3","tailno":"VT456","status":"ACTIVE","network-status":"ACTIVE","id":18489,"contact":"Ramesh Anantarapu","model":"C-21","note":null,"created-at":"Jun 25, 2015 8:27:16 AM","packages":0,"username":"ramesh23","external-account":null,"consumer-type":"AIRCRAFT","isp-id":18469,"parent-id":18473,"subscriber-feature-id":9,"status-code":null,"status-msg":null},
{"company-name":"The AIRTIME 3","tailno":"VT23","status":"ACTIVE","network-status":"OFFLINE","id":18485,"contact":"Ramesh Anantarapu","model":"747-100","note":null,"created-at":"Jun 23, 2015 2:49:15 PM","packages":1,"username":"ramesh","external-account":null,"consumer-type":"AIRCRAFT","isp-id":18469,"parent-id":18473,"subscriber-feature-id":5,"status-code":null,"status-msg":null}],
"status-code":"AIRTIME-P4000","status-msg":"Successfully"}
这是一个平坦的回应。
我现在正努力将其映射到名为AircraftInfo
的顶级POJO
,其中包含另外两个POJOs
作为其实体。
例如:company-name,tailNo和status直接属于AircraftInfo,而user-name,id属于UserInfo POJO,它是AircraftInfo中的实体。
由于JSON响应是平坦的,因此实际上不可能在嵌套结构中映射这样的响应。
有人可以建议最优雅的方式来实现吗?
一种选择是使用@JsonCreator
注释 :
public static class AircraftInfo {
private final String companyName;
private final String tailNo;
private final UserInfo userInfo;
@JsonCreator
public AircraftInfo(Map<String, Object> flatProperties) {
this.companyName = (String) flatProperties.get("company-name");
this.tailNo = (String) flatProperties.get("tailno");
UserInfo user = new UserInfo();
user.setUserName((String) flatProperties.get("username"));
user.setId((Integer) flatProperties.get("id"));
this.userInfo = user;
}
// getters for final fields
}
UserInfo
类如下:
public class UserInfo {
private String userName;
private int id;
// getters and setters
}
您可以将JSON反序列化为以下Response
POJO:
public class Response {
private int size;
@JsonProperty("page-size") // non standard JSON property name
private int pageSize;
@JsonProperty("subscribers-aircraft") // non standard JSON property name
private List<AircraftInfo> subscribersAircraft; // use class defined above!
@JsonProperty("status-code") // non standard JSON property name
private String statusCode;
@JsonProperty("status-msg") // non standard JSON property name
private String statusMsg;
// getters and setters
}
您可以使用以下两个类:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setSerializationInclusion(Include.NON_NULL);
String json = // your exact json here, ESCAPED!
Response response = mapper.readValue(json, Response.class);
尽管您的JSON采用扁平结构,但response
实例应根据您的要求进行构建。
您可以编写自定义反序列化器 。 但是,Jackson的Streaming API并不是最容易使用的工具。
所以我的建议是:将JSON加载到HashMap中(简单地用Map.class
第二个arg调用ObjectMapper.readValue()
)然后你可以构造你的对象并从地图填充它们的状态
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.