使用jackson序列化Generic JSON

时间:2011-12-23 04:12:08

标签: java xml json spring jackson

我想序列化我的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一样。

非常感谢

2 个答案:

答案 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作为类型。不应该真的受伤,只是说它在这种情况下似乎没用。