我想序列化我的POJO类,当生成输出到XML时,它可以像我想要的那样完美。 但不适用于JSON。
我的主要POJO课程
@XmlRootElement(name="result")
@XmlSeeAlso({ResultDataRowItemTest.class})
public class ResultDataRowTest {
private ResultDataRowItemTest response;
public ResultDataRowTest() {}
public ResultDataRowItemTest getResponse() {return response;}
public void setResponse(ResultDataRowItemTest pst) {this.response = pst;}
}
ResultDataRowItemTest类:
public class ResultDataRowItemTest<T> {
private T item;
public ResultDataRowItemTest() {}
@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)
@XmlElements({
@XmlElement(name="user", type=RetUser.class)
})
public T getItem() {return item;}
public void setItem(T pst) {this.item = pst;}
}
RetUser类:
@JsonTypeName("user")
@XmlRootElement(name="user")
public class RetUser {
private int userID;
private String userName;
private String firstName;
private String lastName;
public String getUserName() {return userName;}
public void setUserName(String userName) {this.userName = userName;}
public int getUserID() {return userID;}
public void setUserID(int userID) {this.userID = userID;}
public String getFirstName() {return firstName;}
public void setFirstName(String firstName) {this.firstName = firstName;}
public String getLastName() {return lastName;}
public void setLastName(String lastName) {this.lastName = lastName;}
}
XML的结果:
<result>
<response>
<user>
<firstName>John</firstName>
<lastName>Pantau</lastName>
<userID>5</userID>
<userName>JohnP</userName>
</user>
</response>
</result>
以下是JSON的结果:
{"response":{
"item":{
"user":{
"userID":5,
"userName":"JohnP",
"firstName":"John",
"lastName":"Pantau"
}
}
}}
问题是,如何删除JSON的对象“item”?所以结果就像XML一样。
非常感谢
答案 0 :(得分:1)
看起来您正在使用JAXB for XML和Jackson for JSON。
查看http://wiki.fasterxml.com/JacksonInFiveMinutes#Data_Binding_with_Generics您可能需要传递泛型类型定义。
您需要在ResultDataRowTest中指定Jackson注释。
答案 1 :(得分:1)
首先,我认为您不必非常关心JSON和XML是否相似 - 它们是不同的格式,具有不同的逻辑模型(对象与层次结构),并且与不同的工具一起使用。对于两个看起来有点不同的人来说完全没问题,理想情况下两者看起来都很适合格式本身(即“干净的XML”和“干净的JSON”)。
但是对于'item':如果你有accessor(getItem()),它就会存在。如果你不想要它,你可以压扁你的结构。
另外,我不知道你为什么使用泛型类型参数T,因为你没有真正使用它。也可以使用Object
作为类型。不应该真的受伤,只是说它在这种情况下似乎没用。