0

问题

JSON-B 用户指南在这里建议我应该能够null使用以下代码序列化值:

    Jsonb jsonb = JsonbBuilder.create(new JsonbConfig()
            .withNullValues(true)
            .withAdapters(new StatusAdapter()));

    jsonb.toJson(status,Status.class);

这里的StatusAdapter是我自己的JsonbAdapter impl,用于序列化应用程序的Status类,看起来像这样:

状态适配器

@Override
public JsonObject adaptToJson(Status status) throws Exception {

   // ... 

   return Json.createObjectBuilder()

            .add("field1", status.getField1())               
            .add("field2", status.getField2())               

             // ... continues ...

            .build();

但是,当这些 getter 之一返回时null,我最终会遇到以下异常:

引起:java.lang.NullPointerException:JsonObjects 名称/值对中的值不能在 org.glassfish.json.JsonObjectBuilderImpl.add(JsonObjectBuilderImpl.java 的 org.glassfish.json.JsonObjectBuilderImpl.validateValue(JsonObjectBuilderImpl.java:222) 处为空:90) 在 mypkg.StatusAdapter.adaptToJson(StatusAdapter.java:14) 在 mypkg.StatusAdapter.adaptToJson(StatusAdapter.java:47) 在 org.eclipse.yasson.internal.serializer.AdaptedObjectSerializer.serialize(AdaptedObjectSerializer.java:103)

pom.xml

我使用了JSON-B入门页面中最新版本的 Maven 依赖项:

            <dependency>
                    <groupId>javax.json.bind</groupId>
                    <artifactId>javax.json.bind-api</artifactId>
                    <version>1.0</version>
            </dependency>

            <dependency>
                    <groupId>org.eclipse</groupId>
                    <artifactId>yasson</artifactId>
                    <version>1.0.2</version>
            </dependency>

            <dependency>
                    <groupId>org.glassfish</groupId>
                    <artifactId>javax.json</artifactId>
                    <version>1.1.3</version>
            </dependency>

问题

那么我误解了API吗?或者这是 JSON 相关库的错误组合?其中一个有错误?

我也意识到,当需要反序列化null它时,序列化 a 可能会给我带来第二个问题。如果这有助于指导答案,我将希望稍后使用 JSON-B 进行反序列化。谢谢你。

更新:

这个yasson 问题表明它可能是一个错误。在那里添加了更多细节。

4

1 回答 1

1

您得到的异常基本上是告诉您不能将 null 传递给 JSONP implementation 抛出的 JsonObjectBuilder#add 方法org.glassfish:javax.json

设置JsonbConfig#withNullValues(true)与它无关。

JSONB 和 JSONP 是两个不同的 API,即使 JSONB 确实依赖于 JSONP。org.eclipse:yasson是 JSONB API 的实现,在您的情况下确实使用org.glassfish:javax.json- JSONP API 的实现,因为您在 POM 中提供了它。

设置JsonbConfig#withNullValues(true)是对 JSONB API 的调用,它确实意味着“将空值打印到 JSON”,例如:

{ firstname: null, lastname: null }

因此,当org.eclipse:yasson(JSONB) 在 pojo 对象属性中遇到空值时,它会执行类似javax.json.stream.JsonGenerator#writeNull(key).

这与您的代码没有任何关系,StatusAdapter其中基本上是JsonObjectBuilder#add使用空值调用 JSONP API,这是不允许的。

于 2018-11-02T14:27:27.373 回答