杰克逊 - 反序列化JSON字符串 - TypeReference vs TypeFactory.constructCollectionType

44

StackOverflow问题中获取了将JSON字符串反序列化为类列表的不同方法:

类型1 (文档链接):

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

类型 2 (文档链接):

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

虽然上述两种类型都能完成任务,但这些实现方式之间有什么区别呢?


这个类 SomeClass 可以变成泛型并且像列表从 JSON 构建一样吗? - kChak
2个回答

42

构建JavaType之后,它们都调用相同的反序列化功能,唯一的区别是处理通用类型的方式不同。

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

第一个是动态的,因此它可以用于构建关于其参数化不同的东西。

个人偏好第一个选项适用于所有情况(它避免了创建一个以上的匿名内部类),但第二个选项可能更易读。


这个类 SomeClass 可以变成泛型并且像列表从 JSON 构建一样吗? - kChak
是的,你可以有 SomeClass<OtherType>,并且它可以通过 TypeReference 或动态构建来使用;反序列化也应该能够正常工作。 - StaxMan

0

你可以通过以下方式之一来实现:

List<SomeClass> list = Arrays.asList(mapper.readValue(jsonString, SomeClass[].class));


这会增加创建一个数组的开销。 - OneCricketeer
是的,和@StaxMan上面分享的例子一样,我们在typeReference中确保提供“SomeClass.class”的列表。 示例:["new TypeReference<List<SomeClass>>()"] - Kinghizzzzz
我不这么认为。Stax的答案没有构建列表和数组。 - OneCricketeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接