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

2023-12-15

我正在使用来自外部合作伙伴的 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 块,到了第三次违规时,我意识到最好的选择是忽略违反它的字段。


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

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 从 SD 卡创建一个可绘制对象以设置为 Android 中的背景

    我正在尝试使用 SD 卡中的图像并将其设置为相对布局的背景 我尝试过在这里和其他地方找到的其他解决方案 但它们似乎对我不起作用 这是我的代码 我已经评论了我尝试过但不起作用的其他方法 唯一对我有用的是使用 setBackgroudnReso
  • 绑定到 VisualStateManager 中控件的属性

    我在 Stackoverflow 上搜索了这个问题 但我认为其他帖子没有涵盖这个问题 在我的自定义控件中 我使用视觉状态管理器 视觉状态管理器内部有一个动画 可以对元素的高度进行动画处理 当我尝试绑定到控件属性时 我在启动时收到以下错误 附
  • 上传文件不起作用 - 需要帮助

    我正在尝试使用 WebBrowser 控件上传文件 图像 似乎无法做到这一点 需要一些帮助 这是 HTML
  • 从 servlet 访问数据

    我有一个要求 mysql 数据库只能从本地主机访问 我必须实现一个 servlet 来访问数据库 从而允许该系统中的其他服务器访问数据 servlet 将充当代理 然而 该系统由一个远程服务器组成 该服务器下载大部分数据并执行如下语句 se
  • Bash 中的 RSS 日期到纪元

    寻找 bash 行以采用 RSS 日期格式 例如 Fri 13 Sep 2013 17 16 45 GMT 并将其转换为毫秒 我已经尝试过如下的事情 它们不会在几毫秒内产生 我运行的是 Mac OS X Snow Leopard 10 6
  • 在新存储库上推送原始主错误

    我刚刚开始使用 git 和 github 我按照他们的指示进行操作 但在最后一步遇到了错误 我正在检查当前不受源代码控制的现有目录 项目大约一周前 除此之外 我的用例应该是非常普通的 这是发生的事情 git push origin mast
  • 如何隐藏行索引

    我想将此 DataFrame 写入不带索引值的 xlsx 文件 我该怎么做 writer pd ExcelWriter r D pandas xlsx today datetime datetime today header pd Mult
  • 将 1 和 0 的字符串转换为二进制值

    我正在尝试将来自 stdin 的传入 1 和 0 字符串转换为各自的二进制值 其中诸如 11110111 之类的字符串将转换为 0xF7 这看起来很微不足道 但我不想重新发明轮子 所以我想知道 C C 标准库中是否有任何东西已经可以执行这样
  • 数组中给定数字的最小窗口

    最近看到这个问题 给定 2 个数组 第二个数组包含第一个数组的一些元素 返回第一个数组中包含第二个数组的所有元素的最小窗口 Eg 给定 A 1 3 5 2 3 1 和 B 1 3 2 Output 3 5 其中 3 和 5 是数组 A 中的
  • Javascript'this'值改变,但不明白为什么

    我是一个 Javascript 新手 我正在尝试了解 OLN 我遇到的是 当从同一对象上的另一个方法调用对象方法时 被调用方法中 this 的本地值正在改变 这是我的代码 var generator generateForLevelSkil
  • 使用 MPAndroidChart 库重叠饼图标签

    我正在使用菲尔杰MPAndroid图表图书馆 implementation com github PhilJay MPAndroidChart v3 1 0 And I implemented Pie Chart Pie Chart wit
  • 在Xamarin浏览器控件中访问html响应内容

    我有一个似乎不寻常的要求 我和我的同事无法在我们的 Xamarin 项目中实现 我们试图做的是动态处理浏览器导航到的任何页面的内容 而不是简单地处理从其访问的初始 URL 返回的内容 我见过以这种方式访问 返回内容的解决方案 Xamarin
  • 如何在 C# 中创建动态大小的数组或重新调整数组的大小?

    我需要知道如何在 C 中动态调整数组大小 在我下面编写的方法中 我需要能够返回一个仅包含用户输入的数字 最多 8 个数字 的数组 因此 如果用户决定只想输入 3 个数字 则数组应该只包含 3 个数字 而不是 8 个 现在我知道数组在实例化时
  • 在 Spring 测试中禁用 @EnableScheduling

    当我运行单元测试时 它会调用我的计划任务 我想防止这种行为 这是因为我有 EnableScheduling在我的主要应用程序配置上 如何在单元测试中禁用此功能 我遇到过这个问题 答案这建议设置配置文件 不知道我会怎么做 或者是否太过分了 我
  • MySQL 查询 - 使用 URL 名称识别数据,其中数据被组织成层次结构

    我有一个名为 content 的 mysql 表 它存储内容管理系统的内容数据 注意 所有内容都使用父 id 列组织成层次结构 id slug content type id parent 1 portfolio 5 0 2 about u
  • Java 同时淡入和淡出两个 JPanel

    我有一个 JPanel 列表 我想将其显示为 幻灯片 其中一个 JPanel 淡出 列表中的下一个 JPanel 淡入 这是我正在摆弄的代码 public float opacity 0f private Timer fadeTimer p
  • 在 Windows 上仅安装 Quicktime 库

    There s Quicktime SDK对于 Windows 但任何使用它的应用程序都需要在系统上安装 Quicktime 运行时库 SDK 本身只有标头和库存根 而不是实际的 DLL 如果我的应用程序使用 Quicktime 我想使用其
  • Jquery MVC 4 客户端验证不起作用

    我正在尝试在一个简单的 MVC 4 应用程序上使用 jQuery 验证插件 我在 MVC 3 中完成的操作没有任何问题 但我根本无法让它工作 我希望在以下情况下触发验证 1 我的控制失去焦点 2 提交表单 任何关于我错过的想法将不胜感激 L
  • Google place api 在 Android 中显示错误

    我在这里面临一个奇怪的问题 我想从我的 Android 应用程序查询 google 地点网络服务 为此 我总是收到错误 此服务需要 API 密钥 然而 当我尝试使用 Chrome 浏览器和服务器密钥查询它时 我得到了正确的响应 对于 and
  • 忽略“无法从 START_ARRAY 令牌中反序列化 java.util.LinkedHashMap 实例”错误

    我正在使用来自外部合作伙伴的 API 不幸的是 返回的响应似乎没有固定的结构 理想情况下 API 合同意味着它不会被违反 但这种情况不断发生 无论如何 JSON 响应中的字段主要是一个映射 但有时 突然它是一个列表 例如 假设以下是我通常得