Jackson - Deserialising JSON string - TypeReference vs TypeFactory.constructCollectionType

2022-09-01 01:37:49

要将 JSON 字符串反序列化为类列表,请在 StackOverflow 问题中列出的不同方式

类型 1(文档链接):

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

类型 2(文档链接):

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

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


答案 1

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

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

第一个是动态的,因此它可以用来构造参数化方面变化的东西。

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


答案 2

另一种方法可以实现此目的::

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