JSON-B выполняет сериализацию NPE с помощью адаптера, хотя устанавливает значение NullValues (true)
проблема
Руководство пользователя JSON-B предлагает здесь, чтобы я мог сериализовать null
значения с моим кодом:
Jsonb jsonb = JsonbBuilder.create(new JsonbConfig()
.withNullValues(true)
.withAdapters(new StatusAdapter()));
jsonb.toJson(status,Status.class);
Здесь StatusAdapter - мой собственный JsonbAdapter, предназначенный для сериализации класса Status приложения, и выглядит примерно так:
StatusAdapter
@Override
public JsonObject adaptToJson(Status status) throws Exception {
// ...
return Json.createObjectBuilder()
.add("field1", status.getField1())
.add("field2", status.getField2())
// ... continues ...
.build();
Но когда один из этих геттеров возвращается null
Я получаю исключения, такие как:
Вызывается: java.lang.NullPointerException: значение в паре имя / значение JsonObjects не может быть пустым в org.glassfish.json.JsonObjectBuilderImpl.validateValue(JsonObjectBuilderImpl.java:222) в org.glassfish.json.jl_ImpIbB:90) в mypkg.StatusAdapter.adaptToJson(StatusAdapter.java:47) в mypkg.StatusAdapter.adaptToJson(StatusAdapter.java:14) в org.eclipse.yasson.internal.serializer.AdaptedObjectSerial3.jpg
pom.xml
Я использовал последние версии зависимостей Maven со страницы " Приступая к работе с JSON-B":
<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 для десериализации позже, если это поможет направить ответ. Спасибо.
Обновить:
Эта проблема Ясона предполагает, что это может быть ошибка. Добавил больше подробностей там.
1 ответ
Исключение, которое вы получаете, в основном говорит вам, что вы не можете передать нуль в метод JsonObjectBuilder#add, который генерируется реализацией JSONP org.glassfish:javax.json
,
настройка JsonbConfig#withNullValues(true)
не относится к этому.
JSONB и JSONP - это два разных API, хотя JSONB зависит от JSONP. org.eclipse:yasson
это реализация JSONB API, которая в вашем случае использует org.glassfish:javax.json
- реализация API JSONP, потому что вы предоставили его в своем POM.
настройка JsonbConfig#withNullValues(true)
это вызов JSONB API, который означает "напечатать нулевые значения в JSON", например:
{
firstname: null,
lastname: null
}
Так когда org.eclipse:yasson
(JSONB) встречает нулевое значение в свойстве объекта pojo, оно делает что-то вроде javax.json.stream.JsonGenerator#writeNull(key)
,
Это никак не связано с вашим кодом в StatusAdapter
который в основном вызывает API JSONP JsonObjectBuilder#add
с нулевым значением, что недопустимо.