首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Jackson将JSON反序列化为ArrayList<POJO>

使用Jackson将JSON反序列化为ArrayList<POJO>
EN

Stack Overflow用户
提问于 2012-03-23 03:46:36
回答 5查看 190.4K关注 0票数 105

我有一个Java类MyPojo,我对从JSON反序列化感兴趣。我配置了一个特殊的MixIn类MyPojoDeMixIn来帮助我进行反序列化。MyPojo只有intString实例变量与适当的getter和setter组合在一起。MyPojoDeMixIn看起来像这样:

代码语言:javascript
复制
public abstract class MyPojoDeMixIn {
  MyPojoDeMixIn(
      @JsonProperty("JsonName1") int prop1,
      @JsonProperty("JsonName2") int prop2,
      @JsonProperty("JsonName3") String prop3) {}
}

在我的测试客户端中,我执行以下操作,但它当然不能在编译时工作,因为存在与类型不匹配相关的JsonMappingException

代码语言:javascript
复制
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }

我知道我可以通过创建一个只有一个ArrayList<MyPojo>的"Response“对象来缓解这个问题,但是我必须为我想要返回的每个类型创建这些无用的对象。

我也在网上看过JacksonInFiveMinutes,但我很难理解关于Map<A,B>的东西以及它与我的问题的关系。如果你看不出来,我是一个全新的Java新手,来自Obj-C背景。他们特别提到:

除了绑定到POJO和“简单”类型之外,还有一个额外的变体:绑定到泛型(类型化)容器。这种情况需要特殊的处理,因为所谓的类型擦除( Java用来以某种向后兼容的方式实现泛型),它阻止您使用诸如Collection.class (无法编译)之类的东西。

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

代码语言:javascript
复制
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });

如何直接反序列化到ArrayList

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-23 03:53:42

您可以使用TypeReference包装器直接反序列化为列表。一个示例方法:

代码语言:javascript
复制
public static <T> T fromJSON(final TypeReference<T> type,
      final String jsonPacket) {
   T data = null;

   try {
      data = new ObjectMapper().readValue(jsonPacket, type);
   } catch (Exception e) {
      // Handle the problem
   }
   return data;
}

它的用法如下:

代码语言:javascript
复制
final String json = "";
Set<POJO> properties = fromJSON(new TypeReference<Set<POJO>>() {}, json);

TypeReference Javadoc

票数 160
EN

Stack Overflow用户

发布于 2016-03-10 23:04:51

另一种方法是使用数组作为类型,例如:

代码语言:javascript
复制
ObjectMapper objectMapper = new ObjectMapper();
MyPojo[] pojos = objectMapper.readValue(json, MyPojo[].class);

这样您就避免了使用Type对象的所有麻烦,如果您确实需要一个列表,您可以通过以下方式将数组转换为一个列表:

代码语言:javascript
复制
List<MyPojo> pojoList = Arrays.asList(pojos);

我想这更具可读性。

要使其成为实际的列表(可以修改,请参阅Arrays.asList()的限制),只需执行以下操作:

代码语言:javascript
复制
List<MyPojo> mcList = new ArrayList<>(Arrays.asList(pojos));
票数 114
EN

Stack Overflow用户

发布于 2017-02-25 23:47:46

这个变体看起来更简单和优雅。

代码语言:javascript
复制
CollectionType typeReference =
    TypeFactory.defaultInstance().constructCollectionType(List.class, Dto.class);
List<Dto> resultDto = objectMapper.readValue(content, typeReference);
票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9829403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档