使用Gson或Jackson对JSON进行反序列化时忽略空字段

时间:2016-04-06 13:30:41

标签: java json jackson gson deserialization

我知道在将对象序列化为JSON时,有很多关于跳过具有空值的字段的问题。 在将JSON反序列化为对象时,我想跳过/忽略具有空值的字段。

考虑班级

public class User {
    Long id = 42L;
    String name = "John";
}

和JSON字符串

{"id":1,"name":null}

做的时候

User user = gson.fromJson(json, User.class)

我希望user.id成为' 1'并user.name成为约翰'。

Gson或Jackson是否可以采用一般方式(没有特殊的TypeAdapter或类似方式)?

3 个答案:

答案 0 :(得分:0)

要跳过使用TypeAdapters,我会在调用setter方法时让POJO进行空检查。

或者看看

@JsonInclude(value = Include.NON_NULL)

注释需要在Class级别,而不是方法级别。

@JsonInclude(Include.NON_NULL) //or Include.NON_EMPTY, if that fits your use case 
public static class RequestPojo {
    ...
}

对于Deserialise,您可以在课程级别使用以下内容。

@JsonIgnoreProperties(ignoreUnknown = true)

答案 1 :(得分:0)

我在我的案例中所做的是在getter上设置默认值

public class User {
    private Long id = 42L;
    private String name = "John";

    public getName(){
       //You can check other conditions
       return name == null? "John" : name;
    }
}

我想这对许多领域都是一种痛苦,但它适用于字段数较少的简单情况

答案 2 :(得分:0)

虽然不是最简洁的解决方案,但凭借杰克逊,您可以使用自定义@JsonCreator自行设置属性:

public class User {
    Long id = 42L;
    String name = "John";

    @JsonCreator
    static User ofNullablesAsOptionals(
            @JsonProperty("id") Long id,
            @JsonProperty("name") String name) {
        User user = new User();
        if (id != null) user.id = id;
        if (name != null) user.name = name;
        return user;
    }
}