【问题标题】:jackson deserialization into pojosjackson 反序列化成 pojos
【发布时间】:2011-03-16 13:10:44
【问题描述】:

我正在尝试反序列化来自我无法控制的应用程序的 JSON 对象。这是我的 JSON:

{"assembly":
     {"name":"mm9",
      "id":32,
      "chromosomes":[
             {"chromosome":
                  {"name":"MT"}
             }]}}

我的Pojos,是

class Assembly{
      private String name;
      private int id;
      private ArrayList<Chromosome> chromosomes;
      // getters & setters
}
class Chromosome {
     private String name;
     //getter/setters

}

但它不起作用,因为额外的字段“装配”和“染色体”,所以使用 JSON 如下:

{"name":"mm9",
  "id":32,
    "chromosomes":[    
             {"name":"MT"}
                 ] }}

它只是工作。 有没有办法在不创建更复杂的 POJOS 的情况下修改配置或实现这一目标?

【问题讨论】:

    标签: java jackson deserialization


    【解决方案1】:

    问题在于,在第一个 JSON sn-p 中,chromosomes 是一个字典 (Map),其中一个条目 (chromosome) 恰好对应于您的 Chromosome 对象。

    到 Java 类的更准确的直接映射是

    class Assembly{
      ...
      private Map<String, Chromosome> chromosomes;
    }
    

    由于您提到您无法控制源 JSON 的格式,您可能希望考虑使用 custom deserializers,或者使用 Jackson 提供的 streaming 支持而不是 ObjectMapper 进行直接映射,如果您不是的话不乐意以这种方式更改您的 POJO。

    顺便说一句,最好通过接口类型(List)而不是具体类型(ArrayList)来引用集合。引用此类的代码不太可能真正关心或需要知道它正在使用ArrayList,而是仅引用List 接口可以更容易地在需要时交换其他实现(作为一般原则)。

    【讨论】:

    • 我确实看过反序列化器和流媒体支持,如果我别无选择,我将创建自己的解析。我只想快速使用一些东西,因为键(程序集、染色体)是类的名称。类似的东西:你看到了组装这个词,所以使用组装构造函数。对于 Map,它实际上是一个染色体列表..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2021-01-19
    • 1970-01-01
    • 2013-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多