Jsonb.fromJson не десериализует набор, созданный из строки JSON, созданной Jsonb.toJson(objectWithSet).JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Jsonb.fromJson не десериализует набор, созданный из строки JSON, созданной Jsonb.toJson(objectWithSet).

Сообщение Anonymous »

У меня есть образец объекта (приведен ниже), который предназначен для использования с JAXB, JSON-B и JPA. Я написал несколько модульных тестов для проверки вывода, но JSON-B меня немного смущает. Когда я десериализую только что сериализованный объект, продукты не совпадают. А именно, набор не десериализуется, хотя он был сериализован нормально.
Я начал с JAXB и смог заставить его работать должным образом.
Мне пришлось создать каталог. класс, чтобы заставить Set правильно обрабатывать, а затем создал XmlJavaTypeAdapter для обработки Path.
Поскольку кажется, что все идет только в одном направлении, я попытался просто создать JsonbDeserializer, но использование нового JsonbConfig().withDeserializers(new DirectorySetDeserializer()), похоже, не сработало. На самом деле он вообще не использовал этот класс.
Идея состоит в том, чтобы иметь возможность использовать один объект для JAXB, JSON и JPA поверх REST, что оказывается намного сложнее. чем я мог себе представить.
Я добавил модульные тесты, чтобы придать мне больше уверенности в том, что
@POST
@Consumes({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Response persistReview(Review review) {
...
}

должно было работать так, как ожидалось. (Конечно, нет)
Maven POM:

jakarta.json.bind
jakarta.json.bind-api
3.0.1


org.eclipse
yasson
3.0.2


Класс каталога (содержится в наборе):
@XmlAccessorType(XmlAccessType.FIELD)
public class Directory {
@XmlElement
@XmlJavaTypeAdapter(ArtifactDirectoryTranslator.class)
private Path path;

public Directory() {}

public Directory(Path path) {
this.path = path;
}

public Path getPath() {
return path;
}

public void setPath(Path path) {
this.path = path;
}
}

Класс JAXB/JSONB/Entity:
@XmlRootElement(name = "review")
@XmlAccessorType(XmlAccessType.FIELD)
public class Review {
@XmlElementWrapper(name = "artifact-directories")
private final Set directories = new HashSet();

public Review addDirectory(Path dirPath) {
directories.add(new Directory(dirPath));
return this;
}

public Set getDirectories() {
return directories;
}

public void setDirectories(Set directories) {
// done this way for JPA/Hibernate
this.directories.clear();
this.directories.addAll(directories);
}
}

Модульный тест:
@Test
public void testJsonb() {
Review uut_review = new Review();
uut_review.addDirectory(Path.of("/some/path/1"));
uut_review.addDirectory(Path.of("/some/path/2"));

JsonbConfig config = new JsonbConfig().withFormatting(true);
Jsonb jsonb = JsonbBuilder.newBuilder().withConfig(config).build();

// totally fine: {"directories":[{"path": "/some/path/1"}, {"path": "/some/path/2"}]}
String jsonResult = jsonb.toJson(uut_review);
System.out.println(jsonResult);

// not so good: {"directories":[]}
Review actualReivew = jsonb.fromJson(jsonResult, Review.class);
String jsonResult2 = jsonb.toJson(actualDataReivew);
System.out.println(jsonResult2);
}

Выходные данные модульного теста:
{
"directories": [
{
"path": "/some/path/1"
},
{
"path": "/some/path/2"
}
]
}
{
"directories": [
]
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... ing-genera
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»