JSR-353 How to add null values using javax.json.JsonObjectBuilder JSR-353 How to add null values using javax.json.JsonObjectBuilder json json

JSR-353 How to add null values using javax.json.JsonObjectBuilder


It might be difficult to get your JsonObjectBuilder implementation from the factory but you can make it simpler.

Create a JsonObjectBuilder decorator class that checks for null:

public class NullAwareJsonObjectBuilder implements JsonObjectBuilder {    // Use the Factory Pattern to create an instance.    public static JsonObjectBuilder wrap(JsonObjectBuilder builder) {      if (builder == null) {        throw new IllegalArgumentException("Can't wrap nothing.");      }      return new NullAwareJsonObjectBuilder(builder);    }    // Decorated object per Decorator Pattern.    private final JsonObjectBuilder builder;    private NullAwareJsonObjectBuilder(JsonObjectBuilder builder) {      this.builder = builder;    }    public JsonObjectBuilder add(String name, JsonValue value) {      builder.add(name, (value == null) ? JsonValue.NULL : value);    }    // Implement all other JsonObjectBuilder methods.    ..}

And how you to use it:

JsonObjectBuilder builder = NullAwareJsonObjectBuilder.wrap(        factory.createObjectBuilder());builder.add("firstname", customer.getFirstame())    .add(...


Another possible solution is to use simple and lean helper to wrap a value into JsonValue object or return JsonValue.NULL if value is null.

Here is an example:

public final class SafeJson {    private static final String KEY = "1";    //private ctor with exception throwing    public static JsonValue nvl(final String ref) {        if (ref == null) {            return JsonValue.NULL;        }        return Json.createObjectBuilder().add(KEY, ref).build().get(KEY);    }    public static JsonValue nvl(final Integer ref) {        if (ref == null) {            return JsonValue.NULL;        }        return Json.createObjectBuilder().add(KEY, ref).build().get(KEY);    }    public static JsonValue nvl(final java.sql.Date ref) {        if (ref == null) {            return JsonValue.NULL;        }        return Json.createObjectBuilder().add(KEY, ref.getTime()).build().get(KEY);    }}

Usage is simple:

Json.createObjectBuilder().add("id", this.someId)    .add("zipCode", SafeJson.nvl(this.someNullableInt))    .add("phone", SafeJson.nvl(this.someNullableString))    .add("date", SafeJson.nvl(this.someNullableDate))    .build(); 

Constructs like Json.createObjectBuilder().add(KEY, ref).build().get(KEY); looks a little bit weird but it is the only portable way to wrap value into JsonValue I've found so far.

In fact in JavaEE8 you can replace it with:

Json.createValue()

or underlying:

JsonProvider.provider().createValue()

call.