java - jackson 的嵌套映射

标签 java json

我收到一个 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/

相关文章:

json - 使用 Swifty JSON 响应填写字典?

java - 无法使 messageSource 在 Pojo 类中工作

ios - 检查 json-feed 中新数据的 Web 服务(?)?

java - 使用来自不同线程的 JMS session

java - Mule - 根据 CSV header 值将 CSV 解析为 HashMap 的 ArrayList

json - golang中严格的json解析器

javascript - 从对象 Javascript 访问数据

java - Gson:java.lang.StackOverflowError: null

java - 如何执行 Maven 构建 Java 应用程序

java - Spring data jpa, native 查询,返回错误的字段类型