使用 jackson 序列化 Map.Entry 时出现问题

2024-05-12

如果我尝试反序列化以下存储为字符串的类型:

 List<Entry<String, String>> entryList;

其中entryList包含:

[{"dummyKey1":"dummyValue1"}]

我收到以下错误

 Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.util.Map$Entry, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information.

在 junit 中运行测试用例时出现上述错误,但如果删除测试用例,则部署后一切运行正常:

由于 Entry 中缺少 NoArgsConstructor,运行 junit 测试用例时出现上述错误。因此,我使用 NoArgsConstructor 创建了一个 DummyEntry,它以 null 参数调用 Entry。

   DummyEntry<K, V> extends SimpleEntry<K, V>

进行此更改后,没有出现上述错误,但在部署更改后我开始出现以下错误。

  Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
  Unrecognized field "dummyKey1", not marked as ignorable (2 known properties: "value", "key"]).

一种方法不适用于 junit,但在生产中有效,而其他方法在 junit 中有效但在生产中无效,原因是什么。

另外,我注意到另一件事:在生产中,Map.Entry 被序列化为

  {'dummyKey1':'dummyValue1'}

而 junit 中的测试用例序列化相同的字符串

 {'key':'dummyKey1', 'value':'dummyValue1'}

这种奇怪行为的原因是什么?我怎样才能让这件事对双方都有效?


我怀疑您可能会遇到不同序列化策略的问题Map.Entry.

在 jackson-databind v2.5.0 (IIRC) 中Map.Entry 作为“已知类型”受到支持 https://github.com/FasterXML/jackson-databind/issues/565。在此版本之前,key and valueMap.Entry 的属性将出现在序列化的 Map.Entry 中。在这个版本之后,情况就不再是这样了。

以下是一些示例测试用例,展示了我的意思:

@Test
public void mapSerialisationPreJackson2_5_0() throws IOException {
  Map<String, String> aMap = Maps.newHashMap();
  aMap.put("dummyKey1", "dummyValue1");

  Set<Map.Entry<String, String>> incoming = aMap.entrySet();

  ObjectMapper objectMapper = new ObjectMapper();

  String serialised = objectMapper.writeValueAsString(incoming);

  // prints: [{"key":"dummyKey1","value":"dummyValue1"}]
  System.out.println(serialised);

  Set<Map.Entry<String, String>> deserialised = objectMapper.readValue(serialised, Set.class);

  // prints: [{key=dummyKey1, value=dummyValue1} (just like you posted in your question) whereas for versions > 2.5.0 the serialised form is ]
  System.out.println(deserialised);
}

@Test
public void mapSerialisationPostJackson2_5_0() throws IOException {
  Map<String, String> aMap = Maps.newHashMap();
  aMap.put("dummyKey1", "dummyValue1");

  Set<Map.Entry<String, String>> incoming = aMap.entrySet();

  ObjectMapper objectMapper = new ObjectMapper();

  String serialised = objectMapper.writeValueAsString(incoming);

  // prints: [{"dummyKey1":"dummyValue1"}]
  System.out.println(serialised);

  Set<Map.Entry<String, String>> deserialised = objectMapper.readValue(serialised, Set.class);

  // prints: [{dummyKey1=dummyValue1}]
  System.out.println(deserialised);
}

在 v2.5.0 之前,Map.Entry 将被序列化为{key=dummyKey1, value=dummyValue1}(就像您在问题中发布的那样)而对于版本> 2.5.0,序列化形式是{dummyKey1=dummyValue1}.

我认为您在测试上下文中使用的 jackson-databind 版本为 2.5.0

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

使用 jackson 序列化 Map.Entry 时出现问题 的相关文章

随机推荐

  • 如何确定服务器是否支持 Range 标头?

    我一直在尝试使用 Range 标头值从特定点流式传输音频 但我总是从一开始就得到歌曲 我正在通过程序执行此操作 因此不确定问题是否出在我的代码中或服务器上 如何确定服务器是否支持 Range 标头参数 Thanks 方式HTTP规范 htt
  • 在PostgreSQL中使用查询设置列类型

    优秀后answer https stackoverflow com questions 4336259 how to query the schema details of a table in postgres作者 Alexandre G
  • 'goto *foo' 其中 foo 不是指针。这是什么?

    我正在玩标签作为值 https gcc gnu org onlinedocs gcc Labels as Values html并最终得到这段代码 int foo 0 goto foo 我的 C C 经验告诉我 foo means dere
  • 在 Akka 中配置嵌套 Router

    我有一些嵌套的路由器 应创建它FromConfig 我想要的是这样的 test akka actor deployment worker router round robin nr of instances 5 slave router b
  • FileReader 在 Ionic 2 中未触发 onloadend

    我正在尝试使用 cordova file plugin 读取本地文件 目前我可以读取本地目录的内容并选择单个文件 但我在获取文件内容时遇到问题 这是我的函数 从列表中选择文件后单击按钮即可调用该函数 import window resolv
  • async wait 在调用异步方法时返回 Task> 而不是 List

    我正在尝试了解 async wait 的用法 并且研究了一些博客文章 现在我已经编写了一个测试代码 但它没有按照我期望的方式工作 我有一个返回列表的方法 private List
  • 在闪亮的应用程序中使用传单地图作为过滤器

    是否可以使用传单地图来过滤闪亮应用程序中的数据 就像在 Tableau 或 Power BI 中一样 方法是单击地图上的某个状态 然后根据条件过滤另一个图表或表格选择 None
  • 删除 ArrayList 对象问题

    我在处理作业时遇到从 ArrayList 中删除对象的问题 如果我使用 正常 for 循环 它的工作原理如下 public void returnBook String isbn for int i 0 i lt booksBorrowed
  • AJAX控制工具包加载所有脚本

    我有一个奇怪的问题 我似乎无法解决 我正在使用 AJAX 控制工具包日历延长器在我的一些页面上 尽管我通过网络找到了信息 但我似乎无法让它与常规程序一起工作ScriptManager控制 它only与一个ToolkitScriptManag
  • 如何列出所有可用的 LookAndFeel 主题?

    如何列出所有可用的 LookAndFeel 主题 我想在 JComboBox 中显示以供用户选择 这真的很简单 public static UIManager LookAndFeelInfo getInstalledLookAndFeels
  • 为什么线程比协程表现出更好的性能?

    我编写了 3 个简单的程序来测试协程相对于线程的性能优势 每个程序都会执行许多常见的简单计算 所有程序都彼此分开运行 除了执行时间之外 我还通过以下方式测量了 CPU 使用率Visual VMIDE 插件 第一个程序使用以下方法进行所有计算
  • Laravel Blade - 链/嵌入多种布局

    在我最喜欢的模板框架中 它们通常具有嵌套布局的能力 这在 Blade 中是可能的吗 例如 master blade php yield content 导航 blade php extend master
  • 在 Rails 中实现多个字段的自动完成

    我有一个应用程序 它实现了群组功能 每个小组有n名成员 此外 每个组都有一个组特定的个人资料图片 我已经能够实现组功能的自动完成 仅记住组名称 我已经参考了以下教程 http railsforum com viewtopic php id
  • 迁移时未找到 Laravel 致命错误类

    我已经跑了artisan migrate reset 我删除了一些迁移文件 因为我不再需要这些表 I ran composer dump autoload其次是artisan dump autoload I ran artisan migr
  • 如何在 C++ 中对静态缓冲区执行字符串格式化?

    我正在处理一段对性能要求非常高的代码 我需要执行一些格式化的字符串操作 但我试图避免内存分配 甚至是内部库的内存分配 在过去 我会做类似以下的事情 假设是 C 11 constexpr int BUFFER SIZE 200 char bu
  • ViewPager 的 Android Viewholder

    您好 我正在使用 ViewPager 但我现在想保留状态 而不是重新生成单元格 我注意到 viewpager 与 listviews 的自定义适配器非常相似 它们的功能类似 listview 在单元格不再出现在屏幕上后重新生成单元格中的数据
  • 在 2020 年 6 月 23 日之前打开此应用程序以确认您的订阅

    在 2020 年 6 月 23 日之前打开此应用程序以确认您的订阅 是什么原因导致的 PurchaseResult 正在返回我的购买 并确认为错误 使用以下代码 设法解决了该问题 for Purchase purchase purchase
  • 如何在 Django 中像应用程序一样从配置中注册 Flask 蓝图?

    如何从我的配置中注册 Flask 蓝图 就像 Django 中的应用程序一样 我想在配置文件中定义蓝图 它将自动注册 config py BLUEPRINTS news files 实际上我一直在一个暂定名为的项目中勾勒出类似的东西臀部口袋
  • 正则表达式删除某些字符周围不需要的空格

    我正在尝试从 JavaScript 文件中删除一些不需要的空格 并在将文件发送到客户端之前使用 C 和 Regex 组合文件 我有一个JavascriptHandler处理 js 文件 效果很好 这是我用来 打包 JavaScript 的函
  • 使用 jackson 序列化 Map.Entry 时出现问题

    如果我尝试反序列化以下存储为字符串的类型 List