gpt4 book ai didi

java - 忽略 "Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token"错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:45 24 4
gpt4 key购买 nike

我正在使用来自外部合作伙伴的 API。不幸的是,返回的响应似乎没有固定的结构。理想情况下,API 契约意味着它不会被违反,但这种情况一直在发生。

无论如何,JSON 响应中的一个字段主要是一个映射,但有时,出乎意料的是一个列表。

例如,假设以下是我通常得到的响应:

{
"majorInfo" : {
"a" : "b"
},
"minorInfo" : {
"c" : "d"
}
}

但在极少数情况下,我会得到一个列表而不是 map 或其他一些违反契约(Contract)的行为。

例如:

{
"majorInfo" : {
"a" : "b"
},
"minorInfo" : []
}

我正在使用 jackson 将此响应映射到 POJO。在某些情况下,当违反契约(Contract)时,我会收到错误,

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token

在这种情况下,即使遵守契约(Contract),我也会丢失字段 majorInfo 中的信息。当一个字段不遵守契约(Contract)时,有什么办法可以忽略它吗?在这种情况下,我的 POJO 的 majorInfo 成员将被正确设置,但 minorInfo 成员将为空。

我知道 @JsonIgnoreProperties(ignoreUnknown = true) 但那会总是忽略 minorInfo 字段。我只希望在该领域不遵守契约(Contract)时忽略它。这可能吗?

我也试过

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

但这也不起作用。

还有其他解决方案吗?外部合作伙伴肯定不会为我们更改他们的 API。那么,我们有什么可行的解决方案吗?

谢谢

编辑:一种解决方案是我对这两种变体都有一个 POJO,并将代码放在 try catch block 中。如果 JSON 响应只有一个字段违反了约定并且仅以一种特定方式,那么这可能会奏效。我实际上得到的回应是巨大的,这是我在第三场发现的第三次违规。我不能继续放置 try catch block ,到第三次违规时,我意识到最好的办法是忽略违反它的字段。

最佳答案

我使用以下线程作为引用找到了解决方案: Jackson: ignoring properties instead of throwing JsonMappingException

我写了一个自定义反序列化器并用它来忽略错误。

public class CustomListingDeserializer extends JsonDeserializer<Map<String, Listing>>{

public CustomListingDeserializer() {
// TODO Auto-generated constructor stub
}

@Override
public Map<String, Listing> deserialize(JsonParser arg0, DeserializationContext arg1)
throws IOException, JsonProcessingException {

ObjectMapper mapper = new ObjectMapper();
JsonNode node = arg0.readValueAsTree();

try
{
return mapper.readValue(node.toString(), new TypeReference<Map<String,Listing>>(){});

}
catch (JsonMappingException e)
{
System.out.println("Issue in deserializing : " + e.getMessage() + "for :" + node.toString());
}
catch (Exception e)
{
throw e;
}
// TODO Auto-generated method stub
return null;
}

}

关于java - 忽略 "Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35574843/

24 4 0