【问题标题】:Jackson unable to map JSON to an Object containing a MapJackson 无法将 JSON 映射到包含 Map 的对象
【发布时间】:2017-05-06 21:12:57
【问题描述】:

我有一个像这样的 Java POJO:

public class Widget {
    private Map<String,Object> params;

    // Getter, setter, ctor, etc...
}

我有一个当前接收 JSON String 的方法,并正在尝试使用 Jackson 的 ObjectMapper 将该 JSON 映射到 Widget 实例:

public Widget fromJSON(String json) {
    ObjectMapper jsonMapper = new ObjectMapper();
    return jsonMapper.readValue(json, Widget.class);
}

目前我传入的 JSON 是:

{
    "params": [{
        "acks": "all"
    }, {
        "retries": 0
    }, {
        "batch.size": 16384
    }, {
        "linger.ms": 1
    }, {
        "buffer.memory": 33554432
    }, {
        "key.serializer": "org.apache.kafka.common.serialization.StringSerializer"
    }, {
        "value.serializer": "org.apache.kafka.common.serialization.StringSerializer"
    }]
}

运行时出现以下异常:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance
    of java.util.LinkedHashMap out of START_ARRAY token

我看到this other question 解决了一个非常相似的问题,除了该问题解决了使用 Jackson 将 JSON 映射到 Java Map,而不是 包含 Java @ 的对象 (Widget) 987654332@.

我使用http://jsonlint.com 来验证 JSON 是否有效。 所以我要么需要更改 JSON 或代码,要么可能同时更改两者。有什么想法吗?

【问题讨论】:

    标签: java json serialization jackson linkedhashmap


    【解决方案1】:

    List&lt;Map&lt;String, Object&gt;&gt; 应该可以解决问题:

    public class Widget {
    
        private List<Map<String, Object>> params;
    
        // Getter and setters ommited
    }
    

    【讨论】:

      【解决方案2】:

      JSON 有效,但不适用于 Map。 params 的值是一个数组,应该是这样的对象:

      {
          "params": {
              "acks": "all",
              "retries": 0,
              "batch.size": 16384,
              "linger.ms": 1,
              "buffer.memory": 33554432,
              "key.serializer": "org.apache.kafka.common.serialization.StringSerializer",
              "value.serializer": "org.apache.kafka.common.serialization.StringSerializer"
          }
      }
      

      Jackson Five Minutes你可以找到如下关系:

      Jackson 将用于简单数据绑定的具体 Java 类型是:

      ╔══════════════════════╦══════════════════════════════╗
      ║      JSON Type       ║          Java Type           ║
      ╠══════════════════════╬══════════════════════════════╣
      ║ object               ║ LinkedHashMap<String,Object> ║
      ║ array                ║ ArrayList<Object>            ║
      ║ string               ║ String                       ║
      ║ number (no fraction) ║ Integer, Long or BigInteger  ║
      ║ number (fraction)    ║ Double (or BigDecimal)       ║
      ║ true|false           ║ Boolean                      ║
      ║ null                 ║ null                         ║
      ╚══════════════════════╩══════════════════════════════╝
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-27
        相关资源
        最近更新 更多