我目前正在尝试反序列化 API 结果,如下所示
[{"name":"MyName","value":"MyValue"},{"name":"MyName2","value":"MyValue2"}]
ArrayList<BasicNameValuePair> entities = JsonUtils.getObjectMapper()
.readValue(receivedData.toString(),
new TypeReference<ArrayList<BasicNameValuePair>>() {});
然后出现如下异常
Exception mapping result.
No suitable constructor found for type...
因为这是 org.apache.http.message.BasicNameValuePair
的内部类,所以我无法以任何方式注释或编辑它。但我看到(从其他 android 项目)很多人使用这个类。有什么方法可以使它正常工作吗?从 BasicNameValuePair
序列化为 String
有效。
最佳答案
Jackson 使用反射来创建您的类的实例。默认情况下,它需要一个无参数的构造函数。 BasicNameValuePair
类没有这样的构造函数。它有一个带有两个参数的构造函数,一个用于name
,一个用于value
。
通常,如果您控制了该类,则可以使用 @JsonProperty
注释构造函数参数,以便 Jackson 使用该构造函数而不是无参数构造函数。由于您无法控制代码,请使用 Mixins。
像这样声明一个类
public static abstract class BasicNameValuePairMixIn {
private BasicNameValuePairMixIn(@JsonProperty("name") String name, @JsonProperty("value") String value) { }
}
像这样配置你的ObjectMapper
// configuration for Jackson/fasterxml
objectMapper.addMixInAnnotations(BasicNameValuePair.class, BasicNameValuePairMixIn.class);
Jackson 现在将使用 mixin 作为您类(class)的模板。
如果您使用的是旧版本的 Jackson,请使用描述的配置 here .
关于java - 使用 Jackson 从 JSON 映射 BasicNameValuePair,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21259975/