我有以下由Jackson映射的类(简化版):
public class POI {
@JsonProperty("name")
private String name;
}
在某些情况下,服务器返回"name": null
,然后我想将name设置为空Java字符串。
是否有任何Jackson注释,或者如果属性为null
,我应该只检查getter中的null并返回空字符串吗?
一个不使用Jackson特性的简单解决方案:为name编写一个Getter,它返回一个空字符串,而不是null,因为Jackson使用这些字符串进行序列化。
public String getName() {
return name != null ? name : "";
}
另一种方法是编写自定义反序列化程序。看这里:http://wiki.fasterxml.com/JacksonHowToCustomSerializers
同样,这个答案是为偶然发现这个线程的SO用户准备的。
虽然被接受的答案在所有意义上都是被接受和有效的,但在我们向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());
希望这能节省一些时间。
Jackson 2.9实际上提供了一种尚未提及的新机制:对属性使用JsonSetter,对字符串等类型使用其等效的“配置重写”。类 。中包含更长的解释
https://medium.com/@cowtowncoder/jackson-2-9-features-b2a19029e9ff
但要点是,您可以这样标记字段(或setter):
@JsonSetter(nulls=Nulls.AS_EMPTY) public String stringValue;
或配置映射器对所有String
值属性执行相同操作:
mapper.configOverride(String.class)
.setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
这两者都会将传入的空值转换为空值,字符串的空值为“”。
这也适用于收集和映射。
问题内容: 我有以下类,它是由Jackson映射的(简化版): 在某些情况下,服务器会返回,然后我想将name设置为空的Java String。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串? 问题答案: 您可以在默认构造函数中或声明时进行设置: 要么
我有多个POJO,对于其中的一些,我希望将所有空字符串反序列化为。
我有一个Android应用程序,与Spring开发的RESTAPI联系。应用程序很好地序列化了一个对象,但是Spring应用程序在每个字段不为null时将其解析为null。有什么不对劲?我该怎么办? 这是REST API方法签名:cambioPassword(@quiestHeader(授权)字符串头,PasswordChange userData) 注意:应用程序和API都使用Gson(我没有在
我想从属性转换空字符串值,并在API响应模型对象中用替换它。 我尝试了这个解决方案,但它在类级别上不起作用。
我已经找了很多但仍然没有得到答案到目前为止,任何帮助是非常感谢! 我有一个简单的到字段映射,并尝试将JSON字符串读取到Java对象。 例外情况: java.lang.IllegalArgumentException:无法解析日期值“null”(格式:“dd-mmm-yyyy”):不可解析日期:“null”com.fasterxml.jackson.databind.deser.std.dateD
我尝试将以下json反序列化为java POJO。 我使用jackson 2.8.6 但我不断得到以下例外情况: 如果我为它添加一个字符串设置器 摘要:一些(设计错误的)API发送给我的是空字符串()而不是,我不得不告诉Jackson忽略这个错误的值。我怎么能这么做?