我有以下类,由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 预期。
spa*_*spa 11
一个简单的解决方案,不使用杰克逊专业:写一个名字的Getter,当Jackson使用那些序列化时,它返回一个空字符串而不是null.
public String getName() {
return name != null ? name : "";
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是编写自定义反序列化器.看这里:http://wiki.fasterxml.com/JacksonHowToCustomSerializers
您可以在默认构造函数中或在声明中进行设置:
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)
同样,此答案适用于偶然发现此线程的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)
希望这可以节省一些时间。