【问题标题】:Map BasicNameValuePair from JSON with Jackson将 JSON 中的 BasicNameValuePair 与 Jackson 映射
【发布时间】:2014-02-11 03:44:40
【问题描述】:

我目前正在尝试反序列化一个 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 有效。

【问题讨论】:

  • 这是一组地图。

标签: java android json serialization jackson


【解决方案1】:

Jackson 使用反射来创建您的类的实例。默认情况下,它需要一个无参数构造函数。 BasicNameValuePair 类没有这样的构造函数。它有一个带有两个参数的构造函数,一个用于name,一个用于value

通常,如果您可以控制该类,则可以使用 @JsonProperty 注释构造函数参数,以便杰克逊使用该构造函数而不是无参数构造函数。由于您无法控制代码,请使用 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 作为您班级的模板。

如果您使用的是旧版本的 Jackson,请使用 here 中描述的配置。

【讨论】:

  • 你是神,我赞美你!
【解决方案2】:

尽量不要在参数名称中使用保留关键字,然后重试。 "名称","值"

【讨论】:

  • 我不明白这个答案。你能澄清一下吗?
  • 我也不懂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多