当前位置: 首页 > 面试题库 >

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

程和煦
2023-03-14
问题内容

我有一些要映射到我的Box对象的JSON :

  {
      "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);

在哪里盒子会有一个设置器来设置json映射

或者,您可以将所有字段添加到Box POJO中,然后使用GSON简化此操作!

例如Json->对象

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

例如对象->杰森

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

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



 类似资料:
  • 问题内容: 我有一个这样的模型: 例如,我从远程获取以下JSON: 当我反序列化此JSON时,and 变量将获得正确的值。但是,我不想解释变量的内容。相反,我希望它是以下字符串: 之后,我将自己解释。我如何获得这个值? 问题答案: Jackson问题596是为原始问题中描述的所需功能而创建的。如果要实施,请投票。 当前可用的解决方案是实现自定义反序列化处理。

  • 问题内容: 我有一个Java类,我对从JSON反序列化感兴趣。我已经配置了一个特殊的MixIn类,以帮助我进行反序列化。只有和实例变量与适当的getter和setter方法相结合。看起来像这样: 在我的测试客户端中,我执行以下操作,但是在编译时它当然不起作用,因为与类型不匹配有关。 我知道我可以通过创建一个仅包含一个“响应”对象的方法来缓解此问题,但是随后我将不得不为我想返回的每种类型创建这些有点

  • 我正在调用一个返回JSON的endpoint,它看起来像这样(在Postman中): 此请求返回的Content-Type头是(与通常的 类来自外部库(编写这个endpoint的人)。无论如何,当我试图通过< code > rest template . exchange()调用这个endpoint时,Jackson都无法将这个JSON反序列化为一个有效的< code>Result类。我正在这样做

  • 问题内容: 我有一个这样的模型: 例如,我从远程获取以下JSON: 当我反序列化此JSON时,and 变量将获得正确的值。但是我不想解释我变量的内容。相反,我希望它是以下字符串: 之后,我将自己解释。我如何获得的价值? 问题答案: Jackson问题596是为原始问题中描述的所需功能而创建的。如果要实施它,请投票。 当前可用的解决方案是实现自定义反序列化处理。 另外,如何使用Jackson将原始J

  • 我有一个这样的结构: 我想使用流行的Jackson库反序列化为这样的类: 其中,属性中的每个条目都成为类映射中的键/值条目。 然而,如果我尝试用Jackson进行简单的反序列化,我会得到以下错误: 使用Jackson如何实现这一点? 谢谢 爱德华多

  • 我试图让下面的例子工作: 然而,它失败了 从这个答案中,我尝试了类似这样的做法: 但这失败了: 由于我正在处理的项目的限制,我无法修改对象映射器。所以我不能简单地做: 这本来是可行的。 还有其他简单的方法可以让ImmutableList反序列化工作吗? 编辑:我设法得到了一个不同的错误,如下所示: 这引发了: 如果我可以为ImmutableListDeserializer或类似的东西构建一个无参数