我有一个Java类MyPojo
,我有兴趣从JSON反序列化。我已经配置了一个特殊的MixIn类,MyPojoDeMixIn
,以帮助我进行反序列化。 MyPojo
只有int
和String
实例变量与适当的getter和setters组合。 MyPojoDeMixIn
看起来是这样的:将JSON反序列化为ArrayList <POJO>使用Jackson
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<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
我怎么能直接反序列化ArrayList
?
你的回答似乎与他们的信息如何使用内置的'TypeReference'支持 - 我只是不明白怎么办呢?请参阅上面就如何指导我的编辑使用泛型。 – 2012-03-22 20:04:14
嗯,它是相关的。但这是生产中代码的一个片段。忘记你的mixin,只需使用我所展示的代码(但是用当前实际bean类的名称替换POJO)。 – Perception 2012-03-22 20:07:39
您的代码已编译,但在尝试打印出关于“NullPointerException”的'arrayList.toString()'时出现运行时异常。我猜测这可能是因为我的POJO不符合其属性的正确命名约定,也就是说,整个问题是Web服务返回Prop1Member而我的对象有Prop1。这是我使用mixins开始的唯一真正原因,所以我不必将'@ JsonProperty'的声明放在我的纯对象中。 – 2012-03-22 20:19:03