gpt4 book ai didi

java - JSR-353 如何使用 javax.json.JsonObjectBuilder 添加空值

转载 作者:太空狗 更新时间:2023-10-29 22:56:18 25 4
gpt4 key购买 nike

因为 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。

所以基本上对于我添加的每个字段,我必须检查该值是否为 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 样板文件)或者我是否遗漏了什么?

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

最佳答案

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

创建一个检查 nullJsonObjectBuilder 装饰器类:

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(...

关于java - JSR-353 如何使用 javax.json.JsonObjectBuilder 添加空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22363925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com