gpt4 book ai didi

java - JSON-B 通过设置 withNullValues(true) 使用适配器命中 NPE 序列化

转载 作者:行者123 更新时间:2023-12-02 10:40:03 25 4
gpt4 key购买 nike

问题

JSON-B 用户指南建议 here我应该能够使用我的代码序列化 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 时,我最终会得到如下异常:

Caused by: java.lang.NullPointerException: Value in JsonObjects name/value pair cannot be null at org.glassfish.json.JsonObjectBuilderImpl.validateValue(JsonObjectBuilderImpl.java:222) at org.glassfish.json.JsonObjectBuilderImpl.add(JsonObjectBuilderImpl.java:90) at mypkg.StatusAdapter.adaptToJson(StatusAdapter.java:47) at mypkg.StatusAdapter.adaptToJson(StatusAdapter.java:14) at org.eclipse.yasson.internal.serializer.AdaptedObjectSerializer.serialize(AdaptedObjectSerializer.java:103)

pom.xml

我使用了 JSON-B Getting Started 中的 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 可能会给我在反序列化时带来第二个问题。如果这有助于指导答案,我稍后会想使用 JSON-B 进行反序列化。谢谢。

更新:

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

最佳答案

您得到的异常基本上是告诉您不能将 null 传递到 JsonObjectBuilder#add 方法中,这是由 JSONP 实现抛出的 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 中的代码没有任何关系。这基本上是调用 JSONP API JsonObjectBuilder#add带有 null 值,这是不允许的。

关于java - JSON-B 通过设置 withNullValues(true) 使用适配器命中 NPE 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52978096/

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