当前位置: 首页 > 知识库问答 >
问题:

RestTemplate-Jackson反序列化器

於意蕴
2023-03-14

我正在尝试使用RestTemplate使用REST服务。我无法反序列化JSON响应。我正在使用一个自定义反序列化程序,我的JSON有3个节点,但看起来只有一个节点到达反序列化程序。以下是更多详细信息。

以下是JSON的响应:

{
    "Hello": {
        "Hi": "Name1",
        "Call": "PhoneNumber1"
    },
    "Hello": {
        "Hi": "Name2",
        "Call": "PhoneNumber2"
    },
    "Hello": {
        "Hi": "Name3",
        "Call": "PhoneNumber3"
    }
}

我正在使用@jsondeselizer对属性Hello的响应类使用自定义反序列化器。

当我执行如下readTree时:

JsonNode node = jp.getCodec().readTree(jp);

它到达了反序列化方法,看起来它只有一个节点,而不是下面的3个节点。有时它有第一个节点,有时有最后一个节点。这里会出什么问题?

提前感谢您查看此问题并提供帮助!

答:正如其他人提到的,这个JSON是无效的,因此Jackson无法对其进行反序列化。我必须将响应作为字符串获取,然后手动反序列化。

共有2个答案

涂飞航
2023-03-14

这很可能是因为这是无效的JSON,您不能有三个同名的节点。

或者严格地说,这不是一个错误,但只有一个名为“Hello”的项会被解释为这个答案中所述的,这是不好的,因为json不能保证对象中的项的顺序,只能保证列表中的项的顺序。

如果您有可能更改响应,我将转而创建一个对象数组。

{“Hello”:[{“Hi”:“Name1”,“Call”:“PhoneNumber1”},{“Hi”:“Name2”,“Call”:“PhoneNumber2”},{“Hi”:“Name3”,“Call”:“PhoneNumber3”}]}然后你会得到一个JsonNode,它是一个可以迭代的JsonNode数组。

寿毅庵
2023-03-14

JsonNode是一个没有特定内容行为的超类。在您的示例中,您应该得到一个ObjectNode,但由于您的属性都具有相同的名称,因此只剩下一个“Hello”属性readTree()是一种通用方法,如果可能,它会自动转换为所需的返回类型。

如果您真的需要这个,您必须将JSON移动到数组结构:

// you will get one ArrayNode containing multiple ObjectNode
[
  {
    "Hello": {
      "Hi": "Name1",
      "Call": "PhoneNumber1"
    }
  },
  {
    "Hello": {
      "Hi": "Name2",
      "Call": "PhoneNumber2"
    }
  },
  {
    "Hello": {
      "Hi": "Name3",
      "Call": "PhoneNumber3"
    }
  }
]

// you will get one ObjectNode containing one property with an ArrayNode
{
  "Hello": [
    {
      "Hi": "Name1",
      "Call": "PhoneNumber1"
    },
    {
      "Hi": "Name2",
      "Call": "PhoneNumber2"
    },
    {
      "Hi": "Name3",
      "Call": "PhoneNumber3"
    }
  ]
}
 类似资料:
  • 我似乎很专注于如何去硬化数组数组。我对这些工具很陌生,无法处理JSON文件,我能够去硬化来自国家(https://restcountries.eu/rest/v2/all)的REST应用编程接口的JSON,但我现在正试图从开放天空应用编程接口(https://opensky-network.org/api/states/all?lamin=45.8389 我有这门课: 有能手和二传手 还有这个:

  • 我在试着读我的。json文件。Is是一个车辆存储类。 这是错误: com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造的实例(尽管至少存在一个Creator):无法构造的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法来从[Source:(File); line: 1,列: 1]处的字符串值反序列化

  • 问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因

  • 问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这

  • 可以序列化/反序列化< code >映射吗 在这种特殊情况下,我知道总是,和 - 第三方类(我有序列化器和反序列化器),其他值是盒装原语。 有可能和杰克逊做这样的事吗?使用MapSerializer/MapDeserializer可以做到这一点吗?(我找不到任何例子)