2012-03-30 55 views
0

我知道我可以将JSON转换为使用HJackson的对象。下面是执行它的代码片段。将JSON转换为多个对象。使用杰克逊

JsonFactory jsonFactory = new JsonFactory(); 
    ObjectMapper mapper = new ObjectMapper(jsonFactory); 
    DTO1 user = mapper.readValue(new File("c:\\oneFile.json"), 
       DTO1.class); 

但我的要求是将JSON转换为多个对象。在我的情况下,像DTO1,DTO2 ......和多个对象,如果可能的话还包括字符串变量。

在杰克逊有没有API来执行此操作。 或者有没有一种方法可以手动选择并将它们存储在相应的DTO(对象)中。

问候 卡兰

回答

4

http://wiki.fasterxml.com/JacksonInFiveMinutes(也看在杰克逊TypeFactory 1.3+):

数据与泛型

绑定除了结合POJO和“简单”类型,还有一个额外的变体:绑定到通用(键入)的容器。这种情况需要特殊的处理,因为所谓的Type Erasure(被Java用来以某种向后兼容的方式实现泛型),这会阻止你使用像Collection.class(它不会编译)的东西。

所以,如果你想将数据绑定到一个地图,你将需要使用:

Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { }); 

这里只需要TypeReference传递泛型类型定义(通过anynomous内部类在这种情况下):重要组成部分是>它定义要绑定的类型。

如果您不这样做(并且仅传递Map.class),则调用相当于绑定到Map(即“无类型”Map),如上所述。


如果你的意思是多态的反序列化,检查此链接http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html其中讨论了使用杰克逊的注释,以协助映射器选择合适的对象作业。


我写这篇今天(我敢肯定,这可以改善),用于简单地把一个JSON字符串,并始终将其转化成的DTO(或是别的什么可以转换成)的列表。这可以用任何类型调用,并且可以修改为返回单个实例或List,或者您希望的任何内容。 OBJECT_MAPPER是一个静态的ObjectMapper变量。

public static <T> List<T> getFromJSONCollection(String jsonString, final Class<T> type) throws IOException { 
    try { 
     return OBJECT_MAPPER.readValue(jsonString, TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, type)); 
    } catch (JsonMappingException e) { 
     return getFromJSON(jsonString, type); 
    } 
    } 

    public static <T> List<T> getFromJSON(final String jsonString, final Class<T> type) throws IOException { 
    return new ArrayList<T>() {{ add(OBJECT_MAPPER.readValue(jsonString, type));}}; 
    } 
+0

感谢Larry的回应。对不起,2年后回复..哈哈哈 – PrabhakaranR 2014-10-22 13:32:58