2

我正在尝试反序列化来自我无法控制的应用程序的 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 的情况下修改配置或实现这一目标?

4

1 回答 1

1

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

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

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

既然您提到您无法控制源 JSON 的格式,您可能需要考虑使用自定义反序列化器,或者可能使用 Jackson 的流式支持而不是 ObjectMapper 进行直接映射,如果您不乐意更改 POJO这边走。

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

于 2011-03-16T13:34:52.393 回答