GSON как исключить свойство на втором уровне сериализации - PullRequest
0 голосов
/ 17 декабря 2018

Я создаю веб-API с помощью Джерси и JaxR и ищу способ предотвратить сериализацию GSON по циклической ссылке.Я нашел много ответов о том, что в случае отношения «родитель> ребенок» мы можем добавить ключевое слово transient к свойству родителя, чтобы оно не было сериализовано.Однако моя ситуация не такая, и я не нашел, как добиться того, что мне нужно.

У меня есть ситуация, когда у одного пользователя есть список многих других пользователей (их друзей):

public class User {
   public int id;
   public String name;
   public List<User> friends;
}

Теперь давайте предположим, что user1 дружит с user2, поэтому ониоба добавлены в список друзей друг друга:

user1.friends.add(user2);
user2.friends.add(user1);

Это вызывает циклическую ссылку при сериализации (и в конечном итоге исключение StackOverflowException).Действительно, друзья пользователя user1 содержат user2, а друзья user2 содержат user1, который содержит user2 .... и так далее!

Однако я не могу просто сделать transient свойством друзей класса User, потому что янужны эти имена друзей и идентификаторы.Я бы предпочел, чтобы свойство друга было исключено на втором уровне сериализации (путем сериализации имени и идентификатора каждого из друзей, но не друзей друзей).

Вот пример сериализованного JSON, который я хотел бынужно:

[
  {
    "id":1,
    "name":"user1"
    "friends": [
      { 
        "id":2,
        "name": "user2"
      }
    ]
  },
  {
    "id":2,
    "name":"user2"
    "friends": [
      { 
        "id":1,
        "name": "user1"
      }
    ]
  }
]

Как мне этого добиться?

Заранее большое спасибо!

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