Jackson - 将空String成员反序列化为null

时间:2016-02-04 22:41:56

标签: java json jackson deserialization

我喜欢用Jackson将一个空的String成员("")反序列化为null。反序列化功能" ACCEPT_EMPTY_STRING_AS_NULL_OBJECT"遗憾的是,不能使用它(见link)。

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
public class Supplier  {
   private Integer id;
   private String name;
   private String image;
   private String link;
   private String description;
}

因此,在对以下JSON String进行反序列化后,字符串成员" link"和"图像"应该为null而不是""。

  {"id":37,"name":"Life","image":"","link":"","description":null}

我正在寻找一种编写自己的反序列化器的方法,可以用于POJO的String成员。有没有办法实现这个目标?我使用的是更快的Jackson 2.6.0。

1 个答案:

答案 0 :(得分:0)

自定义反序列化器可以在Jackson 2.6.0中按如下方式完成。

public class SupplierDeserializer extends JsonDeserializer<Supplier> {

    @Override
    public Supplier deserialize(JsonParser jp, DeserializationContext context) throws IOException, JsonProcessingException {
        Supplier sup = new Supplier();

        JsonNode node = jp.readValueAsTree();

        sup.setId(node.get("id").asInt());

        sup.setDescription(node.get("description").asText());

        String image = node.get("image").asText();
        if("".equals(image)) {
            image = null;
        }
        sup.setImage(image);

        String link = node.get("link").asText();
        if("".equals(link)) {
            link = null;
        }
        sup.setLink(link);

        sup.setName(node.get("name").asText());

        return sup;
    }
}

将自定义反序列化程序注册到Supplier类

@JsonDeserialize(using = SupplierDeserializer.class)
public class Supplier {
    private Integer id;
    private String name;
    private String image;
    private String link;
    private String description;

    // getters and setters
}

调用ObjectMapper类来解析JSON数据

String jsonData = "{\"id\":37,\"name\":\"Life\",\"image\":\"\",\"link\":\"\",\"description\":null}";

Supplier sup = new ObjectMapper().readValue(jsonData, Supplier.class);