【问题标题】:RestTemplate JSON DeserializationRestTemplate JSON 反序列化
【发布时间】:2019-03-06 16:56:38
【问题描述】:

所以让我们假设我们有两个系统(系统 A 和系统 B)以 JSON 格式交换信息,但是来自系统 B 的人并不想真正合作,并声称所有带有有效负载的东西都很好,因为它是“语法上”正确的 JSON。

现在让我们假设你有以下 json 结构

   {
    "INFO": {
        "Animal": {
            "Cat": {}
        }
    }
   }

这确实是一个有效的 JSON,但问题是你可以拥有一个或多个动物,所以在更多动物的场景中,有效负载是:

   {
    "INFO": {
        "Animal": [{
            "Cat": {},
"Dog" :{}
        }]
    }
   }

只有这一次你可以看到 Animal 对象实际上是一个对象数组......所以系统 A 使用 RestTemplate 来解析响应并且有问题,因为“语法上”正确的 JSON 每次在结构上都不同。此外,JSON 中也可能出现错误 - 如果出现错误,JSON 看起来像:"ERRORS" : {[error1, error2, etc.]},

但如果没有错误,它会出现

"ERRORS" : ""

所以请告诉我,我希望有效负载保持一致并像往常一样获得一组对象,无论是一个还是多个,并且在没有错误的情况下没有错误节点,或者我错过了什么?

我正在使用 RestTemplate 和

当有效负载带有一个 Animal(我的 pojo 需要 1 个或多个)时 -> 它会失败,因为它无法将单个对象解析为数组列表。

如果我将其更改为只期望一只动物 - 当不止一只动物出现时它会失败。

不仅如此 - "ERRORS" : "" 被视为字符串,这再次导致解析问题。

那么是否有一些“hack”方法可以让 RestTemplate 中的 Jackson 反序列化器来处理这个“语法上”正确的 JSON,或者 JSON 的整体结构应该澄清和一致(我的意见)

谢谢!

【问题讨论】:

  • 不幸的是,您的 JSON 没有一致定义的结构,您最好的选择可能是使用 Map 并手动检查内容。
  • @chrylis,是的,但是地图在解析时看起来真的很糟糕,Java 中的逻辑很糟糕 :) 但感谢您澄清我的观点,即结构的定义不一致!
  • 不幸的是,如果您不能提供一个类“模板”来映射,这是不可避免的。
  • 来自不同系统的不同 json 模式?还是两个系统都根据数据返回不一致的 json 类型?
  • @Deadpool,系统 A 是消费者系统,它从系统 B 获取不一致的 json。

标签: java json spring resttemplate


【解决方案1】:

您似乎想在您的ObjectMapper 中启用DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY

ObjectMapper mapper = new ObjectMapper()
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

【讨论】:

  • 对于格式错误的 json,这似乎是一个很好的解决方案,可能会坚持下去。谢谢! :)
猜你喜欢
  • 2011-10-08
  • 2021-06-22
  • 2019-04-06
  • 2013-01-18
  • 2018-10-11
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多