繁体   English   中英

如何将 JSON 反序列化为地图<String, Object>成员变量使用杰克逊?

[英]How can I deserialize JSON to a Map<String, Object> member variable using Jackson?

我有一些 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 反序列化为带有少量Stringint成员变量的简单 POJO。 如何将我的 JSON 正确映射到我的json字段并使其行为正确?

我想一旦这个工作json.get("id")将返回12345json.get("values")将返回另一个Map<String, Object> (或Map<String, String> )。 我对使用 Jackson 还是个新手,所以这甚至可能不是做我想做的事情的正确方法。 任何帮助,将不胜感激!

首先,解决您的问题。 您正在尝试将 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 映射

或者您可以将所有字段添加到您的 Box POJO 并使用GSON使这更容易!

例如 Json -> 对象

Gson gson = new Gson();
Box box = gson.fromJson(JSON_STRING, Box.class);

例如对象-> Json

Gson gson = new Gson();
String str = gson.toJson(mBox); //mBox is some box object

GSON 将填充 box 中的所有字段以匹配在 JSON 字符串中找到的键值对。 如果您不想这样做,请忽略这一点,但这是另一种选择!

我认为您需要在构造函数中添加一个带注释的参数。 例如,

public Box(@JsonProperty("json") Map<String, Object> json) {
    // TODO
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM