我正在使用来自外部合作伙伴的 API。不幸的是,返回的响应似乎没有固定的结构。理想情况下,API 合同意味着它不会被违反,但这种情况不断发生。
无论如何,JSON 响应中的字段主要是一个映射,但有时,突然它是一个列表。
例如,假设以下是我通常得到的响应:
{
"majorInfo" : {
"a" : "b"
},
"minorInfo" : {
"c" : "d"
}
}
但在极少数情况下,我会得到一份清单而不是地图或其他违反合同的行为。
例如:
{
"majorInfo" : {
"a" : "b"
},
"minorInfo" : []
}
我正在使用 jackson 将此响应映射到 POJO。在某些情况下,当违反合同时,我会收到错误,
线程“main”中的异常
com.fasterxml.jackson.databind.JsonMappingException:不能
从 START_ARRAY 中反序列化 java.util.LinkedHashMap 的实例
代币
在这种情况下,即使遵守合同,我也会丢失 MajorInfo 字段中的信息。当某个字段不遵守合同时,有什么方法可以忽略它吗?在这种情况下,我的 POJO 的majorInfo 成员将被正确设置,但minorInfo 成员将为空。
我知道 @JsonIgnoreProperties(ignoreUnknown = true) 但这会always忽略minorInfo 字段。我只希望当该领域不遵守合同时忽略它。那可能吗?
我也尝试过
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
但这也不起作用。
还有其他可能的解决方案吗?可以肯定的是,外部合作伙伴不会为我们更改他们的 API。那么,我们这边有什么可行的解决方案吗?
谢谢
编辑:
一种解决方案是我为这两种变体都有一个 POJO,并将代码放在 try catch 块中。如果 JSON 响应只有一个字段违反了约定,并且仅以一种特定方式违反了约定,那么这种方法可能会起作用。我实际上得到的反应是巨大的,这是我在第三场比赛中发现的第三次违规行为。我不能继续放置 try catch 块,到了第三次违规时,我意识到最好的选择是忽略违反它的字段。