Jackson ReadValue无法转换为List<>

时间:2015-09-23 15:03:52

标签: java reflection jackson

我有问题。我使用自定义注释,它采用方法参数并将它们从json转换为pojo。这是一个例子:

...
MethodParameter param 
// here a parameter from methods, marked with custom annotation
...
JSON_MAPPER.readValue(node, param.getParameterType());

java.util.LinkedHashMap cannot be cast to com.liferay.portal.kernel.util.KeyValuePair

但是当我尝试转换List<>它没有用。但下面的代码工作正常

JSON_MAPPER.readValue(node, new TypeReference<List<KeyValuePair>>(){});

我如何计算出收入数据的类型?我该怎么办?

1 个答案:

答案 0 :(得分:2)

我将假设您的方法看起来像

public List<KeyValuePair> methodName(..) {..}

换句话说,它的返回类型是您希望将JSON解析为。

我还假设MethodParameterorg.springframework.core.MethodParameter。您会注意到MethodParameter#getParameterType()返回Class<?>。在这种情况下,它将返回Class类型的List对象。

鉴于List.class,杰克逊无法猜出元素类型是什么。因此,它使用默认的LinkedHashMap

使用MethodParameter#getGenericParameterType()方法,该方法将返回完全描述Type返回类型的List<KeyValuePair>对象。杰克逊将拥有足够的类型信息来构建JSON中的适当对象。

您需要将Type转换为ObjectMapper#readValue预期的JavaType

mapper.readValue(node, mapper.getTypeFactory().constructType(param.getGenericParameterType()));