2011-03-03 72 views
2

我有JSON反序列化的這個特定問題。讓我們來看看這個JSON結構:Jackson:反序列化到集合

{ 
    "header":{ 
    "objects":[ 
     {"field":"value1"}, 
     {"field":"value2"} 
    ] 
    } 
} 

JSON結構不能改變,因爲它來自第三方系統。

現在,讓我們這個簡單的POJO:

@JsonDeserialize(using=PojoDeserializer.class) 
public class Pojo { 
    private string field; 

    //...getter, setter 
} 

所提PojoDeserializer需要{ 「場」: 「值」} JSON字符串,並將其反序列化的POJO的實例。所以,我可以簡單地做這樣的

POJO的實例=新 ObjectMapper()readValue反序列化( 「{\」 字段\ 「: \」 價值\ 「}」,Pojo.class)。

這是我的問題。讓我們有另一個反序列化器PojosCollectionDeserializer,它接受所提到的結構並將其反序列化爲一個Pojo實例集合。我想使用它以類似的方式與前面的例子中:

Collection<Pojo> pojos = new ObjectMapper().readValue("{...}", Collection.class); 

但是,這並不工作,因爲沒有定義的收集應使用PojosCollectionDeserializer創建。有什麼辦法可以實現它嗎?

回答

2

我不知道爲什麼試圖明確指定解串器,因爲它會所有的工作只是像細:

public class Message { 
    public Header header; // or, if you prefer, getter and setter 
} 
public class Header { 
    public List<Pojo> objects; 
} 
public class Pojo { 
    public String field; 
} 

Message msg = objectMapper.readValue(json, Message.class); 

無需任何額外的配置或註解。沒有必要爲這種簡單的情況構建自定義序列化器或反序列化器。

+0

Jackson如何知道實例化'List 對象的'Pojo'實例;'集合?使用運行時類型擦除,我不確定它如何能夠做到這一點。任何見解? – 2011-09-02 18:32:14

+1

類型擦除實際上不是100%完整的:類聲明確實保留了方法和字段聲明以及子類型(「extends Xxx」)聲明的通用類型信息 - 這是Jackson找到內容類型的地方。傳遞Class對象時發生問題;只有List.class,並且沒有「List .class」感謝類型擦除。 – StaxMan 2011-09-06 15:47:28