2016-12-21 96 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 
}