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

忽略“无法从START_ARRAY令牌中反序列化java.util.LinkedHashMap实例”错误

巢星纬
2023-03-14
问题内容

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

无论如何,所以发生的事情是JSON响应中的字段主要是一个地图,但有时却是一个列表。

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

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

但是在极少数情况下,我会得到列表,而不是地图或其他违反合同的情况。

例如:

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

我正在使用杰克逊将此响应映射到POJO。在某些情况下,如果违反合同,我会收到错误消息,

线程“主”中的异常com.fasterxml.jackson.databind.JsonMappingException:无法从START_ARRAY令牌中反序列化java.util.LinkedHashMap实例

在这种情况下,即使遵守合同,我也会丢失majorInfo字段中的信息。如果某个字段不遵守合同,有什么办法可以忽略它?在这种情况下,将正确设置我的POJO的majorInfo成员,但minorInfo成员将为null。

我知道@JsonIgnoreProperties(ignoreUnknown = true),但这 始终
会忽略minorInfo字段。我只希望在不遵守合同的情况下忽略它。那可能吗?

我也试过

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

但这也不起作用。

还有其他解决方案吗?可以肯定的是,外部合作伙伴不会为我们更改其API。那么,从我们的角度来看,任何可行的解决方案?

谢谢

编辑:一种解决方案是我对两个变体都有一个POJO,并将代码放入try
catch块中。如果JSON响应只有一个违反合同且仅以一种特定方式违反的字段,那可能会起作用。我实际上得到的回应是巨大的,这是我在第三方面遇到的第三次违规。我不能再继续尝试尝试阻拦了,由于第三次违规,我意识到最好的选择就是忽略违反它的字段。


问题答案:

我找到了一个使用以下线程作为参考的解决方案:
Jackson:忽略属性,而不是抛出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;
    }

}


 类似资料:
  • 下面提到的是JSON字符串ResultString: 我想将相同的内容转换为A类的对象: B类代码为: 但是获取异常: JSONMappingException:无法从START_ARRAY标记反序列化java.util.LinkedHashMap实例

  • 我需要向网络服务发送帖子请求,但它在异常后返回。 实际服务器响应如下: 我根据以下内容发送请求 我的代码

  • 我正在使用来自外部合作伙伴的应用编程接口。不幸的是,返回的响应似乎没有固定的结构。理想情况下,应用编程接口合同意味着它不会被违反,但这种情况一直在发生。 总之,JSON响应中的一个字段主要是一个映射,但有时,出乎意料地是一个列表。 例如,假设以下是我通常得到的回答: 但在极少数情况下,我会得到一份清单,而不是地图或其他违反合同的行为。 例如: 我用jackson把这个反应映射到POJO。如果违反了

  • 我尝试使用jacksonapi解析json,并提供以下详细信息。但我错了。请查找以下代码和堆栈跟踪的详细信息。 JSON 控制器类 下面这个类是我的bean类。PublisheData.java 发布数据列表.java 我收到以下错误。

  • 问题内容: 我正在尝试将json请求解析为模型。我不知道这段代码有什么问题。json的语法看起来正确,并且在Java模型上也有注释。我不知道为什么会出现如下错误: Java模型: 杰森代码: 问题答案: 您已声明为单个对象,但是将其作为JSON文档中多个对象的数组返回。 您的模型当前将parameters节点定义为一个对象: 这意味着您的模型对象需要一个如下所示的JSON文档: 但是在JSON文档

  • 下面是POJO类: 主要功能如下: