Jackson:将 null Strings 反序列化为空字符串

2022-09-01 21:54:37

我有以下类,由Jackson映射(简化版):

public class POI {
    @JsonProperty("name")
    private String name;
}

在某些情况下,服务器返回,然后我想将name设置为空Java字符串。"name": null

是否有任何 Jackson 注释,或者如果属性为,我是否应该只检查 getter 中的 null 并返回空字符串?null


答案 1

Jackson 2.9实际上提供了一个尚未提及的新机制:使用属性,以及对于诸如 之类的类型,其等效的“配置覆盖”。更长的解释包含在@JsonSetterString.class

https://medium.com/@cowtowncoder/jackson-2-9-features-b2a19029e9ff

但要点是你可以像这样标记字段(或设置者):

@JsonSetter(nulls=Nulls.AS_EMPTY) public String stringValue;

或将映射器配置为对所有值属性执行相同的操作:String

mapper.configOverride(String.class)
 .setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));

两者都会将传入的值转换为空值,对于字符串,空值是“”。null

这也适用于 s 和 s,如预期的那样。CollectionMap


答案 2

同样,这个答案是针对碰巧偶然发现此线程的SO用户

虽然接受的答案在所有意义上都是被接受和有效的 - 但在我们向客户提供服务之后才决定将字符串值设置为字符串的情况下,它并没有帮助我。nullemptyiOS

因此,大约30-40个pojo(增加)并在实例化相关对象或在声明点时初始化它们太多了。

我们是这样做的。

public class CustomSerializerProvider extends DefaultSerializerProvider {

    public CustomSerializerProvider() {
        super();
    }

    public CustomSerializerProvider(CustomSerializerProvider provider, SerializationConfig config,
            SerializerFactory jsf) {
        super(provider, config, jsf);
    }

    @Override
    public CustomSerializerProvider createInstance(SerializationConfig config, SerializerFactory jsf) {
        return new CustomSerializerProvider(this, config, jsf);
    }

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

并且,序列化程序

public class Serializers extends JsonSerializer<Object> {
    public static final JsonSerializer<Object> EMPTY_STRING_SERIALIZER_INSTANCE = new EmptyStringSerializer();

    public Serializers() {}

    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeString("");
    }

    private static class EmptyStringSerializer extends JsonSerializer<Object> {
        public EmptyStringSerializer() {}

        @Override
        public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                throws IOException, JsonProcessingException {
            jsonGenerator.writeString("");
        }
    }
}

然后,在对象映射程序中设置序列化程序。(杰克逊 2.7.4)

ObjectMapper nullMapper = new ObjectMapper();
nullMapper.setSerializerProvider(new CustomSerializerProvider());

希望,这将为某人节省一些时间。