我收到一个 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
,其中包含另外两个 POJO
作为其实体。
虽然例如:company-name、tailNo 和 status 直接属于 AircraftInfo,而 user-name、id 属于 UserInfo POJO,它是 AircraftInfo 中的一个实体。
由于 JSON 响应是扁平的,因此实际上不可能将这样的响应映射到嵌套结构中。
有人可以建议最优雅的实现方式吗?
最佳答案
一个选择是使用 @JsonCreator
annotation :
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);
response
实例现在应该按照您的要求构建,尽管您的 JSON 是扁平结构。
关于java - jackson 的嵌套映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500083/