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

niknxzdl  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(262)

我知道在将对象序列化为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为“John”。
这是可能的,无论是Gson或Jackson在一个通用的方式(没有特殊的TypeAdapter或类似)?

2sbarzqh

2sbarzqh1#

在我的示例中,我所做的是在getter上设置一个默认值。

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

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

我想这对许多字段来说都是一件痛苦的事情,但它只适用于字段数量较少的简单情况

lmvvr0a8

lmvvr0a82#

很多时间过去了,但是如果你像我一样遇到这个问题,并且你至少使用Jackson2.9,那么你可以解决这个问题的一种方法是使用JsonSetter和null。SKIP:

public class User {
    private Long id = 42L;

    @JsonSetter(Nulls.SKIP)
    private String name = "John";

    ... cooresponding getters and setters  

}

这样,当遇到null时,将不会调用setter。
注:更多详细信息请参见here

8xiog9wr

8xiog9wr3#

要跳过使用TypeAdapters,我会在调用setter方法时让POJO执行空值检查。
或者看看

@JsonInclude(value = Include.NON_NULL)

注解需要在类级别,而不是方法级别。

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

对于反序列化,您可以在类级别使用以下命令。
@ JSON忽略属性(忽略未知= true)

mbyulnm0

mbyulnm04#

虽然这不是最简洁的解决方案,但是使用Jackson,您可以使用自定义的@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;
    }
}

相关问题