Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ignore null fields when DEserializing JSON with Gson or Jackson

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)?

like image 316
fweigl Avatar asked Apr 06 '16 13:04

fweigl


3 Answers

A lot of time gone by, but if you like me ran into this question and you are using at least Jackson 2.9 then one way you could sovle it is using JsonSetter and Nulls.SKIP:

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

    ... cooresponding getters and setters  
   
}

This way, when null is encountered, setter will not be called.

Note: more details can be found here.

like image 168
Vytautas Alkimavičius Avatar answered Oct 30 '22 21:10

Vytautas Alkimavičius


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)

like image 38
jeff porter Avatar answered Oct 30 '22 20:10

jeff porter


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

like image 23
flexxxit Avatar answered Oct 30 '22 20:10

flexxxit