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

asc*_*sco 8 java json jackson gson deserialization

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

考虑上课

public class User {
    Long id = 42L;
    String name = "John";
}
Run Code Online (Sandbox Code Playgroud)

和JSON字符串

{"id":1,"name":null}
Run Code Online (Sandbox Code Playgroud)

做的时候

User user = gson.fromJson(json, User.class)
Run Code Online (Sandbox Code Playgroud)

我想 user.id成为'1'并user.name成为'约翰'.

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

Vyt*_*ius 5

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

public class User {
    private Long id = 42L;
    
    @JsonSetter(Nulls.SKIP)
    private String name = "John";

    ... cooresponding getters and setters  
   
}
Run Code Online (Sandbox Code Playgroud)

这样,当遇到null时,setter就不会被调用。

注意:更多详细信息可以在这里找到。


jef*_*ter -1

为了跳过使用 TypeAdapters,我会让 POJO 在调用 setter 方法时执行 null 检查。

或者看看

@JsonInclude(value = Include.NON_NULL)
Run Code Online (Sandbox Code Playgroud)

注释需要位于类级别,而不是方法级别。

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

对于反序列化,您可以在类级别使用以下内容。

@JsonIgnoreProperties(ignoreUnknown = true)

  • @JsonInclude(value = Include.NON_NULL) 似乎仅在序列化时起作用,而在反序列化时不起作用。 (21认同)