How to deserialize a blank JSON string value to null for java.lang.String?

jackson, java, json

Solution

Jackson will give you null for other objects, but for String it will give empty String.

But you can use a Custom `JsonDeserializer` to do this:

class CustomDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
        JsonNode node = jsonParser.readValueAsTree();
        if (node.asText().isEmpty()) {
            return null;
        }
        return node.toString();
    }

}

In class you have to use it for location field:

class EventBean {
    public Long eventId;
    public String title;

    @JsonDeserialize(using = CustomDeserializer.class)
    public String location;
}

Problem

I am trying a simple JSON to de-serialize in to java object. I am however, getting empty String values for `java.lang.String` property values. In rest of the properties, blank values are converting to null values(which is what I want). My JSON and related Java class are listed below. JSON string: ``` { "eventId" : 1, "title" : "sample event", "location" : "" } ``` EventBean class POJO: ``` public class EventBean { public Long eventId; public String title; public String location; } ``` My main class code: ``` ObjectMapper mapper = new ObjectMapper(); mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); try { File file = new File(JsonTest.class.getClassLoader().getResource("event.txt").getFile()); JsonNode root = mapper.readTree(file); // find out the applicationId EventBean e = mapper.treeToValue(root, EventBean.class); System.out.println("It is " + e.location); } ``` I was expecting print "It is null". Instead, I am getting "It is ". Obviously, Jackson is not treating blank String values as NULL while converting to my String object type. I read somewhere that it is expected. However, this is something I want to avoid for java.lang.String too. Is there a simple way?

Original source