【问题标题】:jackson serializer cover String null to empty String("") and keep object null is nulljackson 序列化程序将 String null 覆盖为空 String("") 并保持对象 null 为 null
【发布时间】:2016-10-30 11:42:27
【问题描述】:

我尝试了几种方法

例如

1.创建自定义JsonSerializer,并重写序列化方法

 @Override
 public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    gen.writeString("");
}

并将 JsonSerializer 设置为 NullValueSerializer,如下所示:

objectMapper.getSerializerProvider().setNullValueSerializer(new NullStringSerializer());

但我们无法从 null 中获取 Class Type。所有 null 将被转换为 "" ,包括对象。

2.如果使用 SimpleModule

 SimpleModule simpleModule = new SimpleModule("StringModule", Version.unknownVersion());
 simpleModule.addSerializer(Object.class, new NullStringSerializer());
 objectMapper.registerModule(simpleModule);

在序列化方法中,参数值没有任何为空的属性。

从jackson 2.6.0的资源代码中,找到方法serializeFields在MapSerializer.java(我的对象是一个地图)行:545

 for (Map.Entry<?,?> entry : value.entrySet()) {
            Object valueElem = entry.getValue();
            // First, serialize key
            Object keyElem = entry.getKey();
            if (keyElem == null) {
                provider.findNullKeySerializer(_keyType, _property).serialize(null, gen, provider);
            } else {
                // One twist: is entry ignorable? If so, skip
                if (ignored != null && ignored.contains(keyElem)) continue;
                keySerializer.serialize(keyElem, gen, provider);
            }

            // And then value
            if (valueElem == null) {
                provider.defaultSerializeNull(gen);
            } else {...}
}

当 valueElem 为 null 时,provide 只是将其转换为 null。 并且没有任何界面让我改变策略。

我可以覆盖 MapSerializer ,但我不知道如何将新的 MapSerializer 设置为工厂。

有什么解决办法吗?

期待您的帮助,谢谢!

【问题讨论】:

    标签: string dictionary null jackson serialization


    【解决方案1】:

    寻找解决方案: 抽象类SerializerProvider 有一个名为findNullValueSerializer 的方法,调用该方法可以让序列化程序用于序列化指定属性的空值。 我们可以覆盖SerializerProvider#findNullValueSerializer并匹配String类:

    @Override
    public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException {
        if (property.getType().getRawClass().equals(String.class)) {
            return EmptyStringSerializer.INSTANCE;
        } else {
            return super.findNullValueSerializer(property);
        }
    }
    

    然后将 SerializerProvider 设置为我们的 ObjectMapper 实例。

    完成。

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2016-10-28
      相关资源
      最近更新 更多