Jackson 无法将 JSON 映射到包含地图的对象
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
我看到 this other question 解决了一个非常相似的问题,除了问题地址使用 Jackson 将 JSON 映射到 Java Map
,而不是对象(Widget
) 包含一个Java Map
.
我已经使用 http://jsonlint.com 来验证 JSON 是否有效。 所以我需要更改 JSON 或代码,或者可能两者都更改。 有什么想法吗?
JSON 有效,但不适用于地图。 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 ║
╚══════════════════════╩══════════════════════════════╝
一个 List<Map<String, Object>>
应该可以解决问题:
public class Widget {
private List<Map<String, Object>> params;
// Getter and setters ommited
}
我有一个像这样的 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 有效,但不适用于地图。 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 ║ ╚══════════════════════╩══════════════════════════════╝
一个 List<Map<String, Object>>
应该可以解决问题:
public class Widget {
private List<Map<String, Object>> params;
// Getter and setters ommited
}