有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Jackson将JSON反序列化为Map<String,Object>成员变量?

我想把一些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反序列化为一个简单的POJO,其中包含一些Stringint成员变量。如何正确地将JSON映射到我的json字段并使其正确运行

我可以想象,一旦这项工作json.get("id")将返回12345,而json.get("values")将返回另一个Map<String, Object>(或Map<String, String>)。我还不熟悉使用Jackson,所以这可能不是我想做的事情的正确方式。任何帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    我认为你需要在构造器中添加一个带注释的参数。比如

    public Box(@JsonProperty("json") Map<String, Object> json) {
        // TODO
    }
    
  2. # 2 楼答案

    首先,解决你的问题。您试图将JSON反序列化为一个JSON字符串中没有字段的类,因此它无法找到这些字段并返回异常

    您也可以执行以下操作:

    ObjectMapper mapper = new ObjectMapper();
    Map<String, Object> map = mapper.readValue(JSON_STRING, new TypeReference<Map<String, String>>(){});
    box.setJsonMap(map);
    

    where box将有一个setter来设置json映射

    或者,您可以将所有字段添加到您的BOXPOJO中,并使用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字符串中的键、值对。如果你不想这样做,请忽略这个,但这是另一种选择