【发布时间】:2014-02-02 14:05:41
【问题描述】:
我有一个 pojo 类型,当它被序列化时,它需要将特定的数值设置为一个特殊的字符串。这些值将始终为空,可能非常深入层次结构。
为了实现这一点,我首先将 pojo 转换为具有完整空值的 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 然后序列化为字符串,禁用
SerializationFeature.WRITE_NULL_MAP_VALUES。这似乎效率低下而且很老套。 - 在序列化 JsonNode 之前手动删除 NullNode 实例。鉴于支持排除 pojos 和地图的空值,似乎没有必要这样做,并且它增加了(也许?)不必要的复杂性。
我尝试为NullNode 注册JsonSerializer,但它似乎没有被使用。我注意到NullNode 本身实现了JsonSerializable,它只是委托给SerializerProvider 的空值序列化程序。我犹豫是否要覆盖它,我觉得应该在值序列化之前进行空过滤,但我没有深入了解它的工作原理。
有没有更好的办法?
【问题讨论】: