繁体   English   中英

杰克逊的嵌套映射

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM