当前位置: 首页 > 知识库问答 >
问题:

Jackson:将空字符串反序列化为空字符串

应嘉容
2023-03-14

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

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

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

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

共有3个答案

楚志强
2023-03-14

一个不使用Jackson特性的简单解决方案:为name编写一个Getter,它返回一个空字符串,而不是null,因为Jackson使用这些字符串进行序列化。

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

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

夏侯宏旷
2023-03-14

同样,这个答案是为偶然发现这个线程的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());

希望这能节省一些时间。

闻人花蜂
2023-03-14

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忽略这个错误的值。我怎么能这么做?