我目前正在尝试反序列化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中所述的配置。

10-08 18:01