JSR-353如何使用javax.json.JsonObjectBuilder添加空值 [英] JSR-353 How to add null values using javax.json.JsonObjectBuilder

查看:131
本文介绍了JSR-353如何使用javax.json.JsonObjectBuilder添加空值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于javax.json文档提示创建JsonObject的方式是使用提供的构建器,如:

  JsonBuilderFactory factory = Json.createBuilderFactory(配置); 
JsonObject value = factory.createObjectBuilder()
.add(firstName,John)
.add(lastName,Smith)
.add(年龄,25)
.add(address,factory.createObjectBuilder()
.add(streetAddress,21 2nd Street)
.add(city,纽约州)
.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(配置); 
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);


$ b $ 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(构建器,gender,customer.getGender());
builder.build()

但有些时候感觉不对。
为什么javax.json没有提供更简单的方法来添加空值(没有其他样板文件)还是我缺少一些东西?



我的批评要点与JSR-353 API相比,尽管它看起来像一个非常好的 fluent api(参见apidoc的顶级示例),但事实上并非如此。

解决方案

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



创建一个 JsonObjectBuilder 修饰器类,用于检查 null

  public class NullAwareJsonObjectBuilder实现了JsonObjectBuilder {
//使用工厂模式创建一个实例。
public static JsonObjectBuilder wrap(JsonObjectBuilder builder){
if(builder == null){
throw new IllegalArgumentException(Can not wrap nothing。);
}
返回新的NullAwareJsonObjectBuilder(builder);
}

//为装饰器模式装饰对象。
private final JsonObjectBuilder builder;

private NullAwareJsonObjectBuilder(JsonObjectBuilder builder){
this.builder = builder;

$ b $ public JsonObjectBuilder add(String name,JsonValue value){
builder.add(name,(value == null)?JsonValue.NULL:value);
}

//实现所有其他的JsonObjectBuilder方法。
..
}

以及如何使用它:

  JsonObjectBuilder builder = NullAwareJsonObjectBuilder.wrap(
factory.createObjectBuilder());
builder.add(firstname,customer.getFirstame())
.add(...


AS the javax.json docs suggest the way to create a JsonObject is using the provided builders like:

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();

This example adds values for the gives keys. In real life the values are probably derived from some (pojo) domain object like:

JsonBuilderFactory factory = Json.createBuilderFactory(config);
 JsonObject value = factory.createObjectBuilder()
     .add("firstname", customer.getFirstame())
     .add("lastname", customer.getLastame())
     .add("age", customer.getAge())
     ....

The JsonOBjectBuilder throw a NPE in case key or value is null. In case the customer has no registered age then above code will throw a NPE.

So basically for every field I add I have to check if the value is null or not and add the actual value and otherwise do not add the field or add JsonValue.NULL for the key. This causes a lot of (undesired) boilerplate...

In my case I ended up with custom JsonUtils class including various static methods like:

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);
    }
}

and then calling:

builder = Json.createObjectBuilder();
JsonUtils.add(builder, "id", customer.getId());
JsonUtils.add(builder, "name", customer.getName());
JsonUtils.add(builder, "gender", customer.getGender());
builder.build()

But someway if feels not right. Why does the javax.json provide no easier way to add null values (without if else boilerplate) or am I missing something?

My main point of critism against the JSR-353 api is that despite it looks like a really nice fluent api (see top example from apidoc) but in reality it is not.

解决方案

It might be difficult to get your JsonObjectBuilder implementation from the factory but you can make it simpler.

Create a JsonObjectBuilder decorator class that checks for 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.
    ..
}

And how you to use it:

JsonObjectBuilder builder = NullAwareJsonObjectBuilder.wrap(
        factory.createObjectBuilder());
builder.add("firstname", customer.getFirstame())
    .add(...

这篇关于JSR-353如何使用javax.json.JsonObjectBuilder添加空值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆