我有以下类,由Jackson(简化版)映射:
public class POI {
@JsonProperty("name")
private String name;
}
在某些情况下,服务器返回"name": null
,然后我想将name设置为空Java String。
是否有任何杰克逊注释,或者我应该只检查我的getter中的null并返回空字符串,如果属性是null
?
答案 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
转换为空值,对于字符串,该值是“”。
这同样适用于Collection
和Map
。
答案 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());
希望,这会节省一些时间。