将JSON转换为多个对象。用杰克逊

时间:2012-03-30 11:57:06

标签: json jackson

我知道我可以使用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 ......,如果可能的话,也包括String变量。

杰克逊是否有API执行此操作。 或者有没有办法我可以手动选择并存储在相应的DTO(对象)中。

此致 卡兰

1 个答案:

答案 0 :(得分:4)

来自http://wiki.fasterxml.com/JacksonInFiveMinutes(但也看看Jackson 1.3+中的TypeFactory):

  

使用泛型进行数据绑定

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

因此,如果您想将数据绑定到Map中,则需要使用:

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

其中TypeReference仅需要传递泛型类型定义(在这种情况下通过任何内部类):重要的部分是&gt;它定义了要绑定的类型。

如果你不这样做(并且只是传递Map.class),调用等同于绑定到Map(即“无类型”Map),如上所述。


如果您的意思是多态反序列化,请查看此链接http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html,该链接讨论使用jackson注释来帮助映射器为作业选择正确的对象。


我今天写了这篇文章(我确信它可以改进),只需简单地获取一个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));}};
  }