Джексон / GSON: выбор другого представления, когда объект был достигнут через отношения - PullRequest
4 голосов
/ 24 мая 2011

У меня есть большой граф объектов, из которого я хотел бы представить объекты в RESTful через веб-сервис. Все объекты имеют свойство id, которое служит первичным ключом, уникальным для объектов этого класса. Кроме того, все отношения в моем графе объектов являются двунаправленными. При представлении экземпляра в качестве ресурса REST мне нужно, чтобы все атрибуты экземпляра были записаны в JSON; однако я хочу, чтобы экземпляры, связанные через отношения, просто представлялись их идентификатором, а не сериализовали весь объект в JSON.

Пример: скажем, у Человека есть Собака, а у Собаки есть Человек.

class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private Dog dog;

  // public getters/setters omitted
}

class Dog {
  private Integer id;
  private String name;
  private Person owner;

  // public getters/setters omitted
}

При сериализации данной собаки мне нужен результат:

{"id": 24, "name": "Fifo", "owner": 42}

И при сериализации данного лица мне нужен результат:

{"id": 42, "firstName": "John", "lastName": "Blogs", "dog": 24}

, а не

{"id": 24, "name": "Fifo", "owner":
  {"id": 42, "firstName": "John", "lastName": "Blogs", "dog": 24}
}

и

{"id": 42, "firstName": "John", "lastName": "Blogs", "dog":
  {"id": 24, "name": "Fifo", "owner": 42}
}

соответственно. Я поиграл с аннотацией @JsonValue в Джексоне в методе getId (), но, к сожалению, это применимо всегда, независимо от того, был ли объект напрямую сериализован или достигнут ли объект через связь с другим объектом.

Я бы подумал, что этот вариант использования достаточно распространен. Если это невозможно, что делают другие люди, выставляя объекты в графе объектов через RESTful API.

Спасибо.

1 Ответ

2 голосов
/ 26 мая 2011

Я не могу придумать очевидных способов сделать это с Джексоном (есть много способов переопределить функциональность, поэтому может быть способ сделать это с помощью пользовательских обработчиков, но это не просто), но это звучит как хорошая функция для включения в списки пользователей / разработчиков; другие, возможно, уже реализовали решения, и было бы здорово найти здесь декларативное решение.

На самом деле я подозреваю, что аннотацию типа @JsonKey можно добавить для обработки простых случаев, когда в качестве ключа используется одно свойство. Поэтому запрос функции может иметь смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...