2011-03-16 154 views
2

我想反序列化來自我無法控制的應用程序的JSON對象。在這裏我的JSON:傑克遜反序列化成pojos

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

我的POJO,是

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?

回答

1

問題是在第一個JSON片段中,chromosomes是一個字典(Map),其中一個條目(chromosome)碰巧對應於您的Chromosome對象。

更精確的直接映射到Java類將是

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

既然你提到你無法控制源JSON格式,你可能要考慮使用custom deserializers,或者使用streaming支持來自Jackson而不是ObjectMapper的直接映射,如果你不喜歡以這種方式改變你的POJO。

順便說一句,最好是通過它們的接口類型(List)而不是具體類型(ArrayList)來引用集合。引用這個類的代碼不太可能真正在意或需要知道它使用的是ArrayList,而僅僅指List接口,如果需要(作爲一般原則),則更容易交換其他實現。

+0

我確實看過反序列化器和流式支持,如果我別無選擇,我會創建自己的解析。我想要的東西非常快,因爲鍵(彙編,染色體)是類的名稱。就像:你看到組件的話,所以使用Assembly構造函數。對於地圖,它確實是一個染色體列表。 – oyo 2011-03-16 13:43:16