2016-12-21 60 views
1

我有一個Java POJO像這樣的對象:傑克遜無法JSON映射到包含一個地圖

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

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

我有,目前收到一個JSON String的方法,並嘗試使用傑克遜的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" 
    }] 
} 

在運行此我得到以下異常:使用傑克遜JSON映射到Java Map

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

我看到this other question解決一個非常類似的問題,但這個問題的地址,而不是一個對象(Widget)是包含一個Java Map。我使用http://jsonlint.com來驗證JSON是有效的。 所以我需要改變JSON或者代碼,或者兩者都可以。任何想法?

回答

1

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你可以找到以下關係:

具體的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       ║ 
╚══════════════════════╩══════════════════════════════╝ 
1

一個List<Map<String, Object>>應該做的伎倆:

public class Widget { 

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

    // Getter and setters ommited 
}