序列化具有其他对象引用的
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; }
序列化工作得很好.