Jackson - 反序列化 JSON 字符串 - TypeReference 与 TypeFactory.constructCollectionType

Posted

技术标签:

【中文标题】Jackson - 反序列化 JSON 字符串 - TypeReference 与 TypeFactory.constructCollectionType【英文标题】:Jackson - Deserialising JSON string - TypeReference vs TypeFactory.constructCollectionType 【发布时间】:2012-08-09 19:39:30 【问题描述】:

要将 JSON 字符串反序列化为类列表,*** question 列出的不同方式

类型 1 (docs link):

List<SomeClass> someClassList = mapper.readValue(jsonString, typeFactory.constructCollectionType(List.class, SomeClass.class));

类型 2 (docs link):

List<SomeClass> list = mapper.readValue(jsonString, new TypeReference<List<SomeClass>>()  );

虽然上述两种类型都可以完成工作,但这些实现之间有什么区别?

【问题讨论】:

这个类,SomeClass 是否可以通用化,并且具有从 JSON 构造列表的相同方式? 【参考方案1】:

在构造JavaType之后,两者都调用了相同的反序列化功能,所以唯一的区别是泛型类型的处理方式。

第二个是完全静态的,所以类型在编译类型中必须是已知的,并且不能变化。所以它类似于使用基本的类字面量。

第一个是动态的,因此可用于构造参数化不同的事物。

我个人更喜欢所有情况下的第一种选择(它避免创建一个匿名内部类),但第二种可能更具可读性。

【讨论】:

这个类,SomeClass 是否可以通用化,并且具有与从 JSON 构造列表相同的方式? 是的,您可以拥有SomeClass&lt;OtherType&gt;,它可以通过TypeReference 使用或动态构造;并且反序列化也应该起作用。【参考方案2】:

实现这一目标的另一种方法是:

List&lt;SomeClass&gt; list = Arrays.asList(mapper.readValue(jsonString, SomeClass[].class));

【讨论】:

这有先创建一个数组的开销 是的,我们在上面共享的@StaxMan 示例中所做的相同,在 typeReference 中我们确保提供“SomeClass.class”示例列表:[“new TypeReference >()"] 我不这么认为。 Stax 的回答并没有同时构造一个列表和一个数组

以上是关于Jackson - 反序列化 JSON 字符串 - TypeReference 与 TypeFactory.constructCollectionType的主要内容,如果未能解决你的问题,请参考以下文章

在scala中使用jackson反序列化json

Jackson 将日期字符串反序列化为 Long

spring/jackson:实现对保存JSON字符串的字段自动序列化和反序列化

使用 Jackson 反序列化时禁用标量到字符串的转换

Jackson学习

使用Jackson在android中反序列化具有相同键但不同类型的json