18

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 のトップの例を参照)、実際にはそうではないということです。

4

2 に答える 2