AS javax.json docs は、JsonObject を作成する方法が、次のような提供されたビルダーを使用していることを示唆しています。
JsonBuilderFactory factory = Json.createBuilderFactory(config);
JsonObject value = factory.createObjectBuilder()
.add("firstName", "John")
.add("lastName", "Smith")
.add("age", 25)
.add("address", factory.createObjectBuilder()
.add("streetAddress", "21 2nd Street")
.add("city", "New York")
.add("state", "NY")
.add("postalCode", "10021"))
.add("phoneNumber", factory.createArrayBuilder()
.add(factory.createObjectBuilder()
.add("type", "home")
.add("number", "212 555-1234"))
.add(factory.createObjectBuilder()
.add("type", "fax")
.add("number", "646 555-4567")))
.build();
この例では、与えられたキーに値を追加します。実際には、値はおそらく次のような (pojo) ドメイン オブジェクトから派生します。
JsonBuilderFactory factory = Json.createBuilderFactory(config);
JsonObject value = factory.createObjectBuilder()
.add("firstname", customer.getFirstame())
.add("lastname", customer.getLastame())
.add("age", customer.getAge())
....
JsonOBjectBuilder は、キーまたは値が null の場合に NPE をスローします。お客様の年齢が登録されていない場合、上記のコードは NPE をスローします。
基本的に、追加するすべてのフィールドに対して、値が null かどうかを確認し、実際の値を追加する必要があります。それ以外の場合は、フィールドを追加したり、キーに JsonValue.NULL を追加したりしないでください。これにより、多くの(望ましくない)ボイラープレートが発生します...
私の場合、次のようなさまざまな静的メソッドを含むカスタム JsonUtils クラスになりました。
public static void add(JsonObjectBuilder builder, String name, Long value) {
if (value == null) {
builder.add(name, JsonValue.NULL);
}
else {
builder.add(name, value);
}
}
public static void add(JsonObjectBuilder builder, String name, String value) {
if (value == null) {
builder.add(name, JsonValue.NULL);
}
else {
builder.add(name, value);
}
}
そして、次のように呼び出します。
builder = Json.createObjectBuilder();
JsonUtils.add(builder, "id", customer.getId());
JsonUtils.add(builder, "name", customer.getName());
JsonUtils.add(builder, "gender", customer.getGender());
builder.build()
しかし、どういうわけか、正しくないと感じた場合。javax.json が (if else ボイラープレートなしで) null 値を追加する簡単な方法を提供しないのはなぜですか?
JSR-353 api に対する私の主な批判点は、それが非常に優れた流暢なapi のように見えるにもかかわらず (apidoc のトップの例を参照)、実際にはそうではないということです。