由于 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();
此示例为给定键添加值。在现实生活中,这些值可能来自某些(pojo)域对象,例如:
JsonBuilderFactory factory = Json.createBuilderFactory(config);
JsonObject value = factory.createObjectBuilder()
.add("firstname", customer.getFirstame())
.add("lastname", customer.getLastame())
.add("age", customer.getAge())
....
如果键或值为空,JsonOBjectBuilder 会抛出 NPE。如果客户没有注册年龄,那么上面的代码将抛出 NPE。
所以基本上对于我添加的每个字段,我都必须检查值是否为空并添加实际值,否则不要添加字段或为键添加 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 样板)或者我错过了什么?
我批评 JSR-353 api 的主要观点是,尽管它看起来像一个非常流畅的api(参见 apidoc 的顶级示例),但实际上并非如此。