我有一些JSON我想要映射到我的Box
对象:
{
"created_date": "2015-11-11",
"generation_date": "2015-11-12T20:35:00+0000",
"values": {
"MORNING": 13,
"EVENING": 18,
"NOON": 446,
"NIGHT": "0.60.0"
},
"id": "12345"
}
我的Box
对象看起来像:
public class Box {
@JsonProperty
Map<String, Object> json;
public Box() {
// Blank
}
// Getter and setter for `json` field
}
这是我的代码:
Box box = null;
// `JSON_STRING` below refers to a string of the above JSON
metricsPacket = new ObjectMapper().readValue(JSON_STRING, Box.class);
我一直收到这个错误:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "created_date" (class com.me.Box), not marked as ignorable (one known property: "json"])
我在网上找到的所有示例都只是将JSON反序列化为一个带有少量String
或int
成员变量的简单POJO。如何正确地将我的JSON映射到我的json
字段并使其正常运行?
我想象一旦这项工作json.get("id")
将返回12345
而json.get("values")
会返回另一个Map<String, Object>
(或Map<String, String>
)。我仍然不习惯使用杰克逊,所以这也可能不是我想做的事情的正确方法。任何帮助将不胜感激!
答案 0 :(得分:10)
首先,解决您的问题。您正在尝试将JSON反序列化为一个没有JSON字符串中存在字段的类,因此它无法找到这些字段并返回异常。
您也可以执行以下操作:
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(JSON_STRING, new TypeReference<Map<String, String>>(){});
box.setJsonMap(map);
其中box将有一个setter来设置json map
或者您可以将所有字段添加到Box POJO并使用GSON来简化这些操作!
E.g。 Json - &gt;对象
Gson gson = new Gson();
Box box = gson.fromJson(JSON_STRING, Box.class);
E.g。对象 - &gt; JSON
Gson gson = new Gson();
String str = gson.toJson(mBox); //mBox is some box object
GSON将填充框内的所有字段,以匹配JSON字符串中找到的键值对。如果你不想这样做,请忽略这一点,但这是另一种选择!
答案 1 :(得分:0)
我认为你需要在构造函数中添加一个带注释的参数。例如,
public Box(@JsonProperty("json") Map<String, Object> json) {
// TODO
}