LINUX.ORG.RU

Десериализация объёктов JPA в JSON

 , ,


1

2

Как перегнать всё в json и обратно, кроме самих JPA объектов, от которых оставить только id. Разворачивать обратно в JPA по ссылкам на эти самые id. Всё записывать в виде массива, например. Например, есть:

public class Item {
        public int id;
        public String itemName;
        public User owner;
}

public class User {
        public int id;
        public String name;
        public List<Item> userItems;
        public void addItem(Item i) {
            i.owner = this;
            userItems.add(i);
        }
}

...
User user = new User(1, "Vasya");
Item item = new Item(1, "Book");
Item item2 = new Item(2, "Hat");
user.addItem(item);
user.addItem(item2);
После преобразования в json я хочу получить что-то типа:
[
{ User : {id : 1, name : "Vasya", userItems: [1,2] } },
{ Item : {id : 1, name : "Book", owner : 1},
{ Item : {id : 2, name : "Hat", owner : 1}
]
Ну а потом преобразовать всё это обратно и как-то скормить entity manager'у, если я всё правильно понимаю.
Всё уже описано в JPA и надо это сделать с минимумом телодвижений. Есть ли для этого готовый инструмент или таки придётся писать свой велосипед?

Потому что у меня есть куча объектов с связями, которые указывают на одно и тоже.

Я бы dto создал по структуре которую ты хочешь в json получить и прообразовывал бы dao в dto и обратно. Посмотрим что тебе еще подскажут.

Aber ★★★★★
()
Ответ на: комментарий от Aber

Награждаю тебя медалью, за трудолюбие.

Это решается кастомным (де)сериализатором, который понимает аннотации JPA к твоей JSON библиотеке, делов на несколько часов.

Но конечно, лучше рисовать DTO, DTOFromJPAConverter, JPAFromDTOConverter, DTOFromJPACollectionConverter, JPAFromDTOCollectionConverter.... и не забыть для каждого из этих нужных классов еще по фабрике!

А потом требовать месяц на добавление двух полей в эту кучу овнокода.

Deleted
()
Ответ на: комментарий от Deleted

Ну не получится аннотациями получить как ТС хочет, там иерархия на уровне id, а все участники иерархии в общий список помещены. Тут свой серелизатор писать нужно.

Aber ★★★★★
()
Ответ на: комментарий от Aber

Это решается кастомным (де)сериализатором,

Ну не получится аннотациями

Что ты делаешь в погроммировании если даже пост прочитать не в силах?

Deleted
()
Ответ на: комментарий от Deleted

Это решается кастомным (де)сериализатором

Ну, понятно, я и смотрел уже в эту сторону. Но насколько придётся велосипедить? Мне же еще надо будет это всё развернуть потом, а там всякие обратные друг на друга зависимости с parent/child.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от crutch_master

Но насколько придётся велосипедить?

Насколько нужно настолько и придётся. Задавай конкретные вопросы.

Deleted
()

Есть ли для этого готовый инструмент или таки придётся писать свой велосипед?

Есть spring-data-rest, который позовляет по REST-api через JSON выполнять CRUD-операции с сущностями.

В нём не реализованы операции для массового обновления данных в одной транзакции. Впрочем, их можно закостылить под него.

Tanger ★★★★★
()
Последнее исправление: Tanger (всего исправлений: 1)

В JAX-RS есть стандартные библиотеки

С версии 1.1 JAX-RS является составной частью Java EE 6. Jersey - официальная имплементация JSR-311 и JSR-339.

Пример ответа RESTful-сервера в JSON: https://javabrains.io/courses/javaee_jaxrs/lessons/Returning-JSON-Response/

В JavaEE 8 реализован JAX-RS 2.1 API (JSR-370).

iZEN ★★★★★
()
Ответ на: В JAX-RS есть стандартные библиотеки от iZEN

На заметку.

JSON-связывание при помощи JSON-B – еще одно нововведение, появившееся в Java EE 8. Как и при применении JAXB для XML, JSON-B позволяет декларативно отображать классы Java на JSON и обратно. В Java EE 8 JSON-B бесшовно интегрируется с JAX-RS; JAX-RS Runtime делегирует JSON-отображение ссылочных типов к JSON-B. Таким образом, классы тех типов, что применяются в ресурсах JAX-RS, могут определять аннотации. Без каких-либо дополнительных конфигурационных издержек эти аннотации учитываются в HTTP-запросах и откликах. В следующем примере показан класс User, сериализуемый при помощи JSON-B:

public class User {

    @JsonbTransient
    private long id;

    @JsonbProperty("username")
    private String name;

    ...
}
JAX-RS-ресурс, представляющий конечную точку HTTP в данном прикладном случае, задает для тела запроса или отклика тип «User»:
@Path("users")
@Produces(MediaType.APPLICATION_JSON)
public class UsersResource {

    @Inject
    UserStore userStore;

    @GET
    public List<User> getUsers() {
        return userStore.getUsers();
    }
}
Сериализация JSON-B подхватывает все автоматически: в JSON-объектах переданного по HTTP списка пользователей содержится свойство username и отсутствует id.

iZEN ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.