gson 使用Jackson解析对象列表

cbjzeqam  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(104)

我想用Jackson来解析一个对象列表。有了Gson,我可以很容易地做到这一点:

List<MyType> list = new Gson().fromJson(input, Types.listOf(MyType.class));

和Jackson在一起,似乎更难:

List<MyType> list = new ObjectMapper().readValue(input, /* What to put here? */);

这段代码需要对任何类型的列表都有效(就像Gson一样),所以我不能只创建一个包含MyType列表的类型并将其传递进去。
我试过使用new TypeLiteral<List<MyType>>(){},它可以工作,但只适用于一种类型。如果我把类型传递给方法,它就不再工作了:

public <T> List<T> parse(Class<T> myType) {
    // returns a List<Map<?,?>> instead of List<T>
    return new ObjectMapper().readValue(input, new TypeLiteral<List<T>>(){});
}

我该怎么和Jackson相处?

bkhjykvo

bkhjykvo1#

种情况下更容易

MyType myType = new ObjectMapper().readValue(input, new TypeReference<List<MyType>>() {});

更新答案。

iyfamqjs

iyfamqjs2#

同时我也找到了解决办法。显然,Jackson提供了自己的解决方法:

List<MyType> list = new ObjectMapper().readValue(input, CollectionType.construct(List.class, SimpleType.construct(MyType.class));
093gszye

093gszye3#

以下内容适用于Jackson2.7及更高版本。它不使用过时的静态方法来获取TypeFactory。相反,它从对象Map器获取TypeFactory。

final ObjectMapper mapper = new ObjectMapper();

mapper.readValue(input, mapper.getTypeFactory().constructCollectionType(List.class, MyType.class));

相关问题