java - Jackson 无法将 JSON 映射到包含 Map 的对象

标签 java json serialization jackson linkedhashmap

我有一个像这样的 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,而不是包含的对象 (Widget) Java map

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

最佳答案

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可以发现如下关系:

Concrete Java types that Jackson will use for simple data binding are:

╔══════════════════════╦══════════════════════════════╗
║      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                         ║
╚══════════════════════╩══════════════════════════════╝

关于java - Jackson 无法将 JSON 映射到包含 Map 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41262896/

相关文章:

android - Volley : BasicNetwork. performRequest:意外的响应代码 500

c# - 在 EF 模型的 JSON 序列化期间向嵌套对象添加属性

python - 如何从序列化程序获取数据参数?

Java - JComboBox 使 ItemListener 中的项目选择无效

java - JNA:指向字符的指针**

java - Android 中的自定义最大 asyncTasks

jQuery + get.JSON + Last.FM 问题

javascript - 如何使用 jQueryeach 函数从 html 表中提取数据

c# - C# Dictionary<string, List<string>>.GetObjectData() (serialization) 是否一致?

java - struts2中的文件上传进度条?