序列化具有其他对象引用的
Java对象时,我只需要序列化嵌套对象的一个属性(通常是外键的情况,因此序列化对象引用的“id”属性).其他一切.
例如,我有两个类需要序列化为JSON& XML(为清晰起见,删除了JPA注释):
关系:用户 – >(一对多)Addressinformation;
另外:Addressinformation – >(一对一)用户
@XmlRootElement
public class User {
private String id;
private String firstName;
private String lastName;
private String email;
private Addressinformation defaultAddress;
private Set<Addressinformation> addressinformation;
public User() {
}
@JsonProperty(value = "id")
@XmlAttribute(name = "id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@JsonProperty(value = "firstname")
@XmlAttribute(name = "firstname")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@JsonProperty(value = "lastname")
@XmlAttribute(name = "lastname")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@JsonProperty(value = "email")
@XmlAttribute(name = "email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@JsonIgnore
public Set<Addressinformation> getAddressinformation() {
return addressinformation;
}
public void setAddressinformation(Set<Addressinformation> addressinformation) {
this.addressinformation = addressinformation;
}
@JsonProperty(value = "defaultaddress")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public Addressinformation getDefaultAddress() {
return defaultAddress;
}
public void setDefaultAddress(Addressinformation defaultAddress) {
this.defaultAddress = defaultAddress;
}
}
地址信息:
@XmlRootElement
public class Addressinformation {
private String id;
private String address;
private String details;
private User user;
@JsonProperty(value = "id")
@XmlAttribute(name = "id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@JsonProperty(value = "details")
@XmlAttribute(name = "details")
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
@JsonProperty(value = "address")
@XmlAttribute(name = "address")
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Addressinformation() {
super();
}
}
enter code here
例如,在序列化用户时,我需要:
{
"id" : "idofuser01","email" : "some.email@gmail.com","status" : "OK","firstname" : "Filan","lastname" : "Ovni","defaultaddressid" : "idofaddress01",}
enter code here
序列化Addressinformation时:
{
"id" : "idofaddress01","address" : "R.8. adn","details" : "blah blah","userid" : "idofuser01",}
我试过@JsonManageReference& @JsonBackReference没有成功.如你所见,我也试过@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property =“id”)
解决方法
刚刚找到了使用Jackson 2.1的方法.
使用(这将仅选择Addressinformation的id属性)注释对象引用:
@JsonProperty(value = "defaultaddressid")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
@JsonIdentityReference(alwaysAsId = true)
public Addressinformation getDefaultAddress() {
return defaultAddress;
}
序列化工作得很好.