杰克逊序列化器覆盖字符串null为空String(“"),并保持对象null为null [英] jackson serializer cover String null to empty String("") and keep object null is null

查看:133
本文介绍了杰克逊序列化器覆盖字符串null为空String(“"),并保持对象null为null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试了几种方法

例如

1.创建一个自定义JsonSerializer,并覆盖序列化方法

1.create a custom JsonSerializer, and override serialize method

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

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

and set the JsonSerializer to NullValueSerializer,like this:

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

,但我们无法从null获取类类型.所有null都将隐藏为",包括对象.

but we can not get the Class Type from null. All null will be covert to "" , include the object.

2.if使用SimpleModule

2.if use SimpleModule

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

在serialize方法中,param值没有任何为空的属性.

in the serialize method, the param value do not have any properties which is null.

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

from the resouce code of jackson 2.6.0 , find method serializeFields in MapSerializer.java (my object is a map) line: 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时,提供者仅将其隐瞒为null. 并且没有任何界面可供我更改策略.

when the valueElem is null, the provide just covert it to null. and do not have any interface for me to change the strategy.

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

I can override MapSerializer ,but I do not know how to set the new MapSerializer to the factory.

有什么解决办法吗?

期待您的帮助,谢谢!

推荐答案

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

find a solution : the abstract class SerializerProvider has a method named findNullValueSerializer, which is called to get the serializer to use for serializing null values for specified property. We can override SerializerProvider#findNullValueSerializer and match String class:

@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实例.

and then set SerializerProvider to our ObjectMapper instance.

完成.

这篇关于杰克逊序列化器覆盖字符串null为空String(“"),并保持对象null为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆