我目前正在尝试反序列化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项目中)看到很多人在使用此类。有什么办法可以使它正常工作吗?从String
序列化为BasicNameValuePair
是可行的。 最佳答案
杰克逊使用反射来创建您的类的实例。默认情况下,它需要一个无参数的构造函数。 BasicNameValuePair
类没有这样的构造函数。它具有一个带有两个参数的构造函数,一个用于name
,一个用于value
。
通常,如果您控制了该类,则可以使用@JsonProperty
注释构造函数参数,以便Jackson使用该构造函数而不是no-arg构造函数。由于您无法控制代码,因此请使用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);
杰克逊现在将使用mixin作为您课程的模板。
如果您使用的是Jackson的旧版本,请使用here中所述的配置。