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

新手上路,请多包涵

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

 public abstract class MyPojoDeMixIn {
  MyPojoDeMixIn(
      @JsonProperty("JsonName1") int prop1,
      @JsonProperty("JsonName2") int prop2,
      @JsonProperty("JsonName3") String prop3) {}
}

在我的测试客户端中,我执行以下操作,但当然它在编译时不起作用,因为有一个 JsonMappingException 与类型不匹配相关。

 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> 的“响应”对象来缓解这个问题,但是我将不得不为我想要返回的每一个类型创建这些有点无用的对象。

我还在线查看了 JacksonInFiveMinutes ,但很难理解有关 Map<A,B> 的内容以及它与我的问题的关系。如果您不知道,我是 Java 的新手并且来自 Obj-C 背景。他们特别提到:

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

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

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

如何直接反序列化为 ArrayList

原文由 tacos_tacos_tacos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 789
2 个回答

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

 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;
}

并因此使用:

 final String json = "";
Set<POJO> properties = fromJSON(new TypeReference<Set<POJO>>() {}, json);

类型参考 Javadoc

原文由 Perception 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 ObjectMapper objectMapper = new ObjectMapper();
MyPojo[] pojos = objectMapper.readValue(json, MyPojo[].class);

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

 List<MyPojo> pojoList = Arrays.asList(pojos);

恕我直言,这更具可读性。

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

 List<MyPojo> mcList = new ArrayList<>(Arrays.asList(pojos));

原文由 DevNG 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题