- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
因为 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
实现可能很困难,但您可以使其更简单。
创建一个检查 null
的 JsonObjectBuilder
装饰器类:
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/
我正在从类文件中反编译java代码。有一个java语句为: localObject2 = this.current_result_set;jsr 56;jsr 63;return (ResultSet
JSR-223 之间的主要区别是什么?和 JSR-241 ? 如果我理解正确的话: JSR -223:介绍了 Java 脚本语言引擎,仅此而已!您可以自由使用任何您想要的脚本语言,例如:Groovy、
Eclipse 的 null 分析现在支持 JSR-308,即您现在可以将 @Nonull 等放在泛型类型参数上。 但是,广泛使用的 com.google.code.findbugs:jsr305:3
我通过外部服务收到一条 XML 消息,我可以使用 MOXy 作为我的 JAXB 提供程序将其解码为 POJO。我目前能够使用 JPA (Hibernate) 将对象保存到数据库中,并且当遇到无效数据时
在 Java 门户上,您可以拥有包含其他应用程序提供的数据的 portlet。我们想用 Django 应用程序替换我们现有的 Java 门户,这意味着复制 Java 门户显示 portlet 的能力。
我刚开始使用 Java Bean 验证 (JSR-303/JSR-349/Hibernate Validator),并且了解一般概念。但是,我不确定如何验证组合类型的内容与类型本身。 例如: @Not
我是 BlackBerry OS 开发的新手,我的代码试图在传递 Criteria 参数后使用 LocationProvider 获取城市名称。我是根据这个 link 关注的我从 RIM 本身尝试了“
我有一个关于 JSR 交叉文件验证的问题。我有一个基于休息的获取和发布服务。所以我有类似的东西 @GET ItemOfferId getItem(String) 另外一个是 @Post boolean
在提到 Java、JSP 和 JSF 的各个方面时,我经常看到经常使用“JSR-XXX”标题。用于 CDI 的 JSR-299?或用于某些注释的 JSR-303。 通过“JSR”名称来学习这些概念是否
最近我选择了一个非常有用的网络服务框架,Jersey (JAX-RS 又名 jsr-311;及其摇滚启动实现),以及一个漂亮的验证库 Hibernate Validator (“Bean 验证 API
在我的场景中,我尝试创建注释来验证一个字段是否已填充(如果另一个字段具有某种值)。 界面如下所示: @Target({ElementType.FIELD, ElementType.METHOD}) @
谁能解释一下这两者之间的区别:评估规范与构建实现规范对于任何可用的 JSR 流程,例如,JSR 299 . 有时这是有值(value)的信息来源,但对于作为开发人员的我来说,我应该下载和阅读哪一个?令
我正在查看一些 Java 代码,我注意到以下内容: if (!foo(bar, baz, qux)) { i = 0; jsr 433; } javac 对此感到窒息,说这不是一个语句,并且在
我使用 Hibernate Validator 作为 JSR-303 实现。 假设我有: class Form { @Valid private Owner mainOwner;
第 10.6 章中的规范说: Implementation-specific loader The batch runtime implementation must provide an imple
我有一个具有 JSR 168 规范的 portlet,它曾经在 UPortal(一些基于旧门户的 java 框架)内运行。但是,我需要将此 portlet 从门户中删除,并将其作为独立的应用程序。现在
我正在使用 JSR-330 注释编写一些代码,并且我想针对(或使用)各种实现来测试它。 目前我已经完成了 Dagger Dagger 2 hk2 Spring 还有其他实现吗? 请注意,我不是在谈论
我的主要课程是 public class UserAddressesForm { @NotEmpty private String firstName; @NotEmpty
亲爱的 Spring 社区, 我要实现的是以下内容: 我希望每个 Controller 有一个自定义验证器 (via @InitBinder ) 我希望 Spring 调用 validator.val
阅读有关 osgi 的 wiki 页面 https://en.wikipedia.org/wiki/OSGi我看到没有关于OSGi的JSR只有OSGi相关的JSR。这是否意味着 OSGi 规范已超出
我是一名优秀的程序员,十分优秀!