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.