У меня есть образец объекта (приведен ниже), который предназначен для использования с 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
Jsonb.fromJson не десериализует набор, созданный из строки JSON, созданной Jsonb.toJson(objectWithSet). ⇐ JAVA
Программисты JAVA общаются здесь
1733296981
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) {
...
}
должно было работать так, как ожидалось. (Конечно, нет)
[b]Maven POM:[/b]
jakarta.json.bind
jakarta.json.bind-api
3.0.1
org.eclipse
yasson
3.0.2
[b]Класс каталога (содержится в наборе):[/b]
@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;
}
}
[b]Класс JAXB/JSONB/Entity:[/b]
@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);
}
}
[b]Модульный тест:[/b]
@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);
}
[b]Выходные данные модульного теста:[/b]
{
"directories": [
{
"path": "/some/path/1"
},
{
"path": "/some/path/2"
}
]
}
{
"directories": [
]
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79250191/jsonb-fromjson-does-not-deserialize-the-set-produced-from-the-json-string-genera[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия