杰克逊:将null字符串反序列化为空字符串

时间:2013-12-18 09:55:28

标签: java null jackson

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

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

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

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

4 个答案:

答案 0 :(得分:11)

使用没有杰克逊特色的简单解决方案:为名字写一个Getter,当Jackson使用那些序列化时,它返回一个空字符串而不是null。

public String getName() {
  return name != null ? name : "";
}

另一种方法是编写自定义反序列化器。看这里:http://wiki.fasterxml.com/JacksonHowToCustomSerializers

答案 1 :(得分:8)

Jackson 2.9实际上提供了一种尚未提及的新机制:将@JsonSetter用于属性,并将其等效的“ Config Overrides”用于类似String.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转换为空值,对于字符串,该值是“”。

这同样适用于CollectionMap

答案 2 :(得分:6)

您可以在默认构造函数中设置它,也可以在声明中设置它:

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

    public POI() {
        name = "";
    }
}

OR

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

答案 3 :(得分:5)

同样,这个答案适用于偶然发现此帖子的 SO用户

虽然接受的答案在所有意义上都被接受并且有效 - 但在我们提供服务之后决定将null字符串值设置为empty字符串的情况下,它没有帮助我可供iOS个客户使用。

所以,大约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("");
        }
    }
}

然后,在ObjectMapper中设置序列化程序。 ( Jackson 2.7.4

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

希望,这会节省一些时间。