我有一个Java类MyPojo
,我对从JSON反序列化感兴趣。我配置了一个特殊的MixIn类MyPojoDeMixIn
来帮助我进行反序列化。MyPojo
只有int
和String
实例变量与适当的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>
的"Response“对象来缓解这个问题,但是我必须为我想要返回的每个类型创建这些无用的对象。
我也在网上看过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
?
发布于 2012-03-23 03:53:42
您可以使用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);
发布于 2016-03-10 23:04:51
另一种方法是使用数组作为类型,例如:
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));
发布于 2017-02-25 23:47:46
这个变体看起来更简单和优雅。
CollectionType typeReference =
TypeFactory.defaultInstance().constructCollectionType(List.class, Dto.class);
List<Dto> resultDto = objectMapper.readValue(content, typeReference);
https://stackoverflow.com/questions/9829403
复制相似问题