AS javax.json文档建议使用提供的构建器来创建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();

本示例为Give键添加值。
在现实生活中,值可能源自某些(pojo)域对象,例如:
JsonBuilderFactory factory = Json.createBuilderFactory(config);
 JsonObject value = factory.createObjectBuilder()
     .add("firstname", customer.getFirstame())
     .add("lastname", customer.getLastame())
     .add("age", customer.getAge())
     ....

如果键或值为null,则JsonOBjectBuilder会抛出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没有提供更简单的方法来添加null值(如果没有其他样板的话),或者我错过了什么?

我批评JSR-353 api的主要要点是,尽管它看起来像是一个非常不错的流畅 api(请参阅apidoc的顶级示例),但实际上并非如此。

最佳答案

从工厂获取JsonObjectBuilder实现可能很困难,但是您可以使其更简单。

创建一个JsonObjectBuilder装饰器类,检查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.
    ..
}

以及如何使用它:
JsonObjectBuilder builder = NullAwareJsonObjectBuilder.wrap(
        factory.createObjectBuilder());
builder.add("firstname", customer.getFirstame())
    .add(...

07-24 09:45
查看更多