序列化 Jackson JSON 树模型时排除 NullNode

2023-11-23

我有一个 pojo 类型,在序列化时需要将特定数值设置为特殊字符串。这些值将始终为空,可能非常深入层次结构。

为了实现这一点,我首先将 pojo 转换为带有完整 null 的 JsonNode 以保留属性顺序,然后我沿着结构中的路径设置一些字符串并根据需要创建节点。最后,我让 ObjectMapper 将 JsonNode 序列化为字符串。逻辑看起来像这样:

ObjectMapper nonNullMapper = new ObjectMapper();
nonNullMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

ObjectMapper includeAllMapper = new ObjectMapper();
includeAllMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);

// NullNodes create stubs to maintain property order
JsonNode node = includeAllMapper.valueToTree(pojoInstance);
insertStrings(node);

String json = nonNullMapper.writeValueAsString(node); 
// Halp, there's still nulls

请注意,我知道有一个@JsonInclude注释,所以我实际上不需要两个映射器,但事实证明我想序列化 pojo 实例而不在其他地方使用空值,所以据我所知,我无法使用它。

无论如何,如何避免将 NullNodes 序列化到我的 json 字符串中?到目前为止我发现了两种方法:

  1. 转换为 Map,然后序列化为 String,使用SerializationFeature.WRITE_NULL_MAP_VALUES禁用。这看起来效率低下且老套。
  2. 在序列化 JsonNode 之前手动删除 NullNode 实例。考虑到支持排除 pojo 和映射的空值,似乎没有必要这样做,并且它增加了(也许?)不必要的复杂性。

我尝试注册一个JsonSerializer for NullNode,但似乎并没有被使用。我注意到NullNode本身实现JsonSerializable,它只是委托给SerializerProvider的空值序列化器。我犹豫是否要尝试覆盖它,并且我觉得应该在序列化值之前进行空过滤,但我没有深入挖掘以准确理解它是如何工作的。

有没有更好的办法?


除了@StaxMan 的回答之外,这里还有一些用于修剪 NullNodes 的代码:

public static void stripNulls(JsonNode node) {
    Iterator<JsonNode> it = node.iterator();
    while (it.hasNext()) {
        JsonNode child = it.next();
        if (child.isNull())
            it.remove();
        else
            stripNulls(child);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

序列化 Jackson JSON 树模型时排除 NullNode 的相关文章

随机推荐

  • TfIdfVectorizer:固定词汇的向量化器如何处理新单词?

    我正在研究约 10 万篇研究论文的语料库 我正在考虑三个领域 纯文本 title abstract 我使用 TfIdfVectorizer 获取明文字段的 TfIdf 表示 并将由此产生的词汇反馈回标题和摘要的矢量化器中 以确保所有三种表示
  • 如何在 JavaScript 中使用 Math.random 进行测试?

    我有一个函数可以在最小值和最大值之间选择一个随机值 因此 当我进行测试时 我会测试该值是否落在最小值和最大值之间 但由于我的应用程序出现一些故障 测试有时会通过 有时由于随机性而失败 覆盖 模拟是个好主意吗Math random 返回 0
  • 如何在没有 Box 授权页面的情况下获取访问令牌

    我已被授予访问 协作 文件夹的权限 我需要的是每天访问该文件夹并从中获取文件 现在我生成的开发者令牌将在 1 小时后过期 有什么方法可以让我得到authorization code没有第一条腿 这需要用户界面 这样我就可以在每次获取文件时刷
  • CUDA 联合访问全局内存

    我已经阅读了 CUDA 编程指南 但我错过了一件事 假设我在全局内存中有 32 位 int 数组 我想通过合并访问将其复制到共享内存 全局数组的索引从 0 到 1024 假设我有 4 个块 每个块有 256 个线程 shared int s
  • jquery mouseover和mouseout一直闪烁

    我在使用 jQuery MouseOut 和 MouseOver 时遇到一些问题 每次我将鼠标悬停在选定的 div 上时 就会出现需要显示的子 div 但是 它开始闪烁 我不知道为什么 我已将代码发布在 JsFiddle 上 http js
  • C++ 中的静态 const double

    这是使用 static const 变量的正确方法吗 在我的顶级课程中 形状 ifndef SHAPE H define SHAPE H class Shape public static const double pi private d
  • StackNavigator 通过 Component 给出未定义的错误

    我试图使用 StackNavigator 进行导航 当我使用它从一个屏幕转到另一个屏幕时它会起作用 如所解释的那样here 但是 当我尝试让子组件自行导航时 导航似乎不起作用 并且我找不到任何解决方案 正如下面的代码所示 我尝试使用测试组件
  • 从两个不同位置安装 ClickOnce 应用程序

    我有一个在 NET Framework 3 5 Service pack 1 中使用 C 开发的 Windows 窗体应用程序 该应用程序可以基于开发数据库以及生产数据库进行发布 我正在使用 MSBuild 社区任务来发布我的应用程序 将应
  • .NET Winforms 应用程序是否有自动升级的标准方法?

    如果您有一个安装在大量机器上的Winforms应用程序 是否有实现自动升级功能的标准方法 例如每次启动时 它都会检查网站或网络服务 如果有可用的新版本 它就会下载并安装它 我可以弄清楚如何推出我自己的版本 但我想知道是否已经有任何框架可以帮
  • Android - 如何从微调器中获取所选项目值并将其放入字符串中?

    我在这个帖子上读到了很多类似的问题 但没有一个对我有帮助 这是我的代码 Override protected void onCreate Bundle savedInstanceState super onCreate savedInsta
  • 使用 R 中的 dplyr 查找一列字符串位于另一列中的行

    希望拉回其中一列中的值作为字符串存在于另一列 同一行内 中的行 我有一个 df A lt c cat dog boy B lt c cat in the cradle meet the parents boy mmets world df
  • 如何投影字段是否存在

    如果我有类似结构的文档如下 我正在用计算结果更新它们 我想知道结果是否已经插入到文档中 假设我对每个文档运行计算 c 和计算 d 现在我想显示所有文档的表格并显示计算 d 是否已经执行 对于这个表 我不关心计算 c id 1 a 1 res
  • 强制 JSON.NET 在序列化 DateTime 时包含毫秒(即使 ms 分量为零)

    我使用 JSON NET 直接从对象实例序列化 DateTime 值 不使用带有格式化程序的 DateTime ToString 有没有办法强制 JSON NET 在序列化中包含毫秒 即使 DateTime 的毫秒部分为零 背景 我的这个
  • 用常量列向量替换矩阵中的特定列

    对于神经网络 我想表示一个列向量y 1 2 3 在这样的矩阵中 y 1 0 0 0 1 0 0 0 1 我的矢量y非常大 因此不能选择硬编码 另外 我想避免使用for loops 到目前为止我做了什么 y1 y zeros 1 length
  • 如果您递增一个等于 STL 容器的结束迭代器的迭代器,会发生什么

    如果当迭代器指向向量的最后一个元素时将其增加 2 会怎样 在这个问题询问如何通过 2 个元素将迭代器调整为 STL 容器 提供了两种不同的方法 使用算术运算符 2 或 两次 或使用 std advance 我已经使用 VC 7 对它们进行了
  • Android 应用程序锁定相机

    是否可以获取当前在 Android 设备上锁定相机的应用程序 进程的 Android 应用程序 进程 ID 或包名称或其他 使用以下命令很容易查看它是否已锁定Camera open 但我想找出有它的过程 Thanks CameraServi
  • 如何解决 sqlite 和 c# 中的“'”问题?

    我正在使用 Sqlite 使用 Microsoft Visual C 2008 Express 我知道我的文本中的撇号 在查询中存在问题 我的问题是我认为我可以用 替换它 它似乎不起作用 这是我的代码的简化示例 string myStrin
  • 如何安全地访问 Django 模型中的请求对象

    我正在尝试做的事情 我正在尝试访问我的 django 模型中的请求对象 以便我可以使用以下命令获取当前登录的用户request user 我尝试过的 我发现了一个黑客this地点 但评论中有人指出在生产时不要这样做 我还尝试覆盖模型的 in
  • 计算预测值时发出警告

    使用数据框 x Date Val 1 1 2012 7 2 1 2012 9 3 1 2012 20 4 1 2012 24 5 1 2012 50 a lt seq as Date tail x 1 Date by month lengt
  • 序列化 Jackson JSON 树模型时排除 NullNode

    我有一个 pojo 类型 在序列化时需要将特定数值设置为特殊字符串 这些值将始终为空 可能非常深入层次结构 为了实现这一点 我首先将 pojo 转换为带有完整 null 的 JsonNode 以保留属性顺序 然后我沿着结构中的路径设置一些字