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

忽略“无法将java.util.LinkedHashMap的实例反序列化为起始\u数组令牌”错误

段干楚青
2023-03-14

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

总之,JSON响应中的一个字段主要是一个映射,但有时,出乎意料地是一个列表。

例如,假设以下是我通常得到的回答:

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

但在极少数情况下,我会得到一份清单,而不是地图或其他违反合同的行为。

例如:

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

我用jackson把这个反应映射到POJO。如果违反了合同,我就会犯错误,

线程“main”com中出现异常。fasterxml。杰克逊。数据绑定。JsonMappingException:无法反序列化java实例。util。LinkedHashMap超出起始数组标记

在这种情况下,即使遵守了合同,我也会丢失主要信息字段中的信息。当一个字段不遵守合同时,我可以忽略它吗?在这种情况下,我的POJO的主要信息成员将被正确设置,但minorInfo成员将为空。

我知道@JsonIgnoreProperties(ignoreUnknown=true),但这总是会忽略minorInfo字段。我只希望在现场不遵守合同时忽略它。可能吗?

我也试过

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

但这也不起作用。

还有其他解决方案吗?外部合作伙伴不会为我们改变他们的应用编程接口,这是肯定的。那么,我们这边有什么可行的解决方案吗?

非常感谢。

编辑:一个解决方案是,我为两个变体都有一个POJO,并将代码放在一个try捕获块中。如果JSON响应只有一个字段违反了合同,并且只有一种特定的方式,这可能会奏效。我实际上得到的响应是巨大的,这是我在第三个字段上捕获的第三个违规。我不能一直放try捕获块,在第三个违规时,我意识到最好的选择是忽略违反它的字段。

共有2个答案

闾丘鸣
2023-03-14

您可以编写自己的java方法,将输入json转换为遵守合同的“标准”json,然后在其上使用Jackson。

沿着以下路线的东西:

private String transform(String input)
{
    String result = input;

    if (result.contains("\"minorInfo\" : []"))
    {
        result = result.replace("\"minorInfo\" : []", "");
    }

    return result;
}
秦诚
2023-03-14

我找到了一个使用以下线程作为参考的解决方案: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;
    }

}
 类似资料:
  • 问题内容: 我正在使用来自外部合作伙伴的API。不幸的是,返回的响应似乎没有固定的结构。理想情况下,API合同意味着它不会被违反,但是这种情况一直在发生。 无论如何,所以发生的事情是JSON响应中的字段主要是一个地图,但有时却是一个列表。 例如,假设以下是我通常得到的响应: 但是在极少数情况下,我会得到列表,而不是地图或其他违反合同的情况。 例如: 我正在使用杰克逊将此响应映射到POJO。在某些情

  • 我已经有一段时间不高兴了。我是Spring的新手,真的需要一些帮助。 我试图使用SpringBoot从DB表返回代码列表。当我从浏览器中的URL调用我的REST控制器时。。。 示例URL:localhost:8081/cis/utl/lookupchoice/O.s/ 它返回以下内容: 但是,当试图从客户端控制器运行此操作时,我会收到一条错误消息。电话看起来像这样: 错误:嵌套异常为com。fas

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

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

  • 我正在与jackson一起阅读Mailchimp的Mandrill API返回的JSON响应。对于API响应来说,该响应有点非常规,因为它在方括号内包含把手——一个对象列表。围绕此错误的其他堆栈溢出讨论涉及不在列表中的API响应。 我得到这个错误。。。 定义此响应对象的正确方法是什么? 我尝试用以下类型定义响应。都没有奏效。 @milchalk...如何准确地使用您的对象映射器建议与我目前调用AP

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