我有一个 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 字符串中?到目前为止我发现了两种方法:
- 转换为 Map,然后序列化为 String,使用
SerializationFeature.WRITE_NULL_MAP_VALUES
禁用。这看起来效率低下且老套。
- 在序列化 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(使用前将#替换为@)