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

syn*_*gma 8 java null jackson

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

public class POI {
    @JsonProperty("name")
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sta*_*Man 13

Jackson 2.9 实际上提供了一种尚未提及的新机制:使用@JsonSetterfor 属性,以及对String.class. 更长的解释包含在

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

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

@JsonSetter(nulls=Nulls.AS_EMPTY) public String stringValue;
Run Code Online (Sandbox Code Playgroud)

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

mapper.configOverride(String.class)
 .setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
Run Code Online (Sandbox Code Playgroud)

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

这也适用于Collections 和Maps 预期。

  • 当 API 可以发送“null”作为值或根本不发送字段时,设置“@JsonSetter(nulls = Nulls.AS_EMPTY)”对我有用。在这两种情况下,它都被映射到空字符串。正是我需要的,谢谢! (2认同)

spa*_*spa 11

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

public String getName() {
  return name != null ? name : "";
}
Run Code Online (Sandbox Code Playgroud)

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


rei*_*eer 6

您可以在默认构造函数中或在声明中进行设置:

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

    public POI() {
        name = "";
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

public class POI {
    @JsonProperty("name")
    private String name = "";
} 
Run Code Online (Sandbox Code Playgroud)


Tir*_*ath 5

同样,此答案适用于偶然发现此线程的SO用户

尽管已接受的答案在所有意义上都是可以接受和有效的-但是,只有在我们向客户提供服务之后,才决定将null字符串值设置为字符串,这对我没有帮助。emptyiOS

因此,在实例化有问题的对象或在声明时,大约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);
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,序列化器

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("");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在ObjectMapper中设置序列化程序。(杰克逊2.7.4

ObjectMapper nullMapper = new ObjectMapper();
nullMapper.setSerializerProvider(new CustomSerializerProvider());
Run Code Online (Sandbox Code Playgroud)

希望这可以节省一些时间。