簡體   English   中英

Jackson無法將JSON映射到包含Map的對象

[英]Jackson unable to map JSON to an Object containing a Map

我有一個像這樣的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

我看到另一個問題解決了一個非常類似的問題,除了該問題使用Jackson來解決,將JSON映射到Java Map ,而不是包含 Java Map的對象( Widget )。

我已經使用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將用於簡單數據綁定的具體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 ║ ╚══════════════════════╩══════════════════════════════╝ 

List<Map<String, Object>>應該可以解決問題:

public class Widget {

    private List<Map<String, Object>> params;

    // Getter and setters ommited
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM