#java #json #serialization #jackson
#java #json #сериализация #джексон
Вопрос:
Я пытаюсь правильно сериализовать объект, который доступен для двух объектов, а также для его собственного объекта. Я хочу иметь возможность просматривать администраторов сайта, а также сайты, администратором которых является пользователь, и администраторов определенного сайта. Я пробовал использовать @JSONbackmanaged, и он просто выдавал только идентификаторы. Возможно ли что-то подобное? Это псевдокод, поэтому возможны синтаксические ошибки, но он максимально приближен к возможному. Hibernate управляет ORM и загрузкой этих pojo.
public class SiteAdmin {
private Integer id;
private Site site;
private User user;
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
public Facility getSite() {
return this.sitey;
}
public void setSite(Site site) {
this.site = site;
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
}
и в user.java У меня есть
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
public Set<SiteAdmin> getSiteAdmins() {
return this.siteAdmins;
}
и в site.java У меня есть
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
public Set<SiteAdmin> getSiteAdmins() {
return this.siteAdmins;
}
То, что я ищу при сериализации, выглядит примерно так
для пользователя:
{
id: 2
name: 'foo',
siteAdmin: {
user: 2,
site: { id: 6, name: 'site' }
}
}
Для сайта
{
id: 6
name: 'site',
siteAdmins: [
{
user: {id : 2, name: 'foo'},
site: 6
},
{
user: {id : 3, name: 'bar'},
site: 6
},
]
}
Вместо этого я получаю что-то вроде этого
{
id: 6
name: "site",
siteAdmins: [
{
site: {
id: 6
name: "site",
siteAdmins: [
site: 6,
user: {id : 2, name: "foo"}
]
},
user: {id : 3, name: "bar"}
},
1
]
}
Ответ №1:
Я смог решить эту проблему, используя @JsonIgnoreProperties вместо @JsonIdentityInfo. Он будет игнорировать дочерние свойства в set. ex.
В site.java
@JsonIgnoreProperties({"site"})
public Set<SiteAdmin> getSiteAdmins() {
return this.siteAdmins;
}
В user.java
@JsonIgnoreProperties({"user"})
public Set<SiteAdmin> getSiteAdmins() {
return this.siteAdmins;
}