Ignore null fields when DEserializing JSON with Gs

2020-06-16 02:10发布

问题:

I know there's lots of questions about skipping fields with a null value when serializing objects to JSON. I want to skip / ignore fields with null values when deserializing JSON to an object.

Consider the class

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

and the JSON string

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

When doing

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

I want user.id to be '1' and user.name to be 'John'.

Is this possible with either Gson or Jackson in a general fashion (without special TypeAdapters or similar)?

回答1:

What i did in my case is to set a default value on the getter

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

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

I guess this will be a pain for many fields but it works in the simple case of less number of fields



回答2:

To skip using TypeAdapters, I'd make the POJO do a null check when the setter method is called.

Or look at

@JsonInclude(value = Include.NON_NULL)

The annotation needs to be at Class level, not method level.

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

For Deserialise you can use following at class level.

@JsonIgnoreProperties(ignoreUnknown = true)



回答3:

Albeit not the most concise solution, with Jackson you can handle setting the properties yourself with a custom @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;
    }
}