2013-07-02 82 views
1

我正在使用Jackson並希望將子類的字段序列化爲子元素。不幸的是,傑克遜的文件很糟糕將子類序列化爲子元素

@JsonRootName(value = "subclass") 
public class ProfilerTask extends Task { 

    private int age; 

    private int grade; 



    public ProfilerTask(String name, Date createdOn, int age, int grade) { 
     super(name, createdOn); 
     this.age = age; 
     this.grade = grade; 
    } 

    /** 
    * @return the age 
    */ 
    public int getAge() { 
     return age; 
    } 

    /** 
    * @return the grade 
    */ 
    public int getGrade() { 
     return grade; 
    } 

} 

我得到這個:{"name":"test task","createdOn":1372771395040,"age":25,"grade":4},而其實我是想子類的字段是一個子元素。

+0

如果你想有子元素,你必須使用組合而不是繼承。 –

+0

嗨,我可以不知何故說傑克遜寫一個領域不是在目前的水平,但1級以下? – damluar

回答

1

我想,你應該考慮構圖而不是繼承。但是如果你真的想繼承,你必須改變POJO類。您可以創建新的內部類並將所有屬性和字段移動到這個新類中。見我的例子:

public class ProfilerTask extends Task { 

    private Subclass subclass; 

    public ProfilerTask(String name, long createdOn, int age, int grade) { 
     super(name, createdOn); 
     this.subclass = new Subclass(); 
     this.subclass.age = age; 
     this.subclass.grade = grade; 
    } 

    public Subclass getSubclass() { 
     return subclass; 
    } 

    @JsonIgnore 
    public int getAge() { 
     return subclass.age; 
    } 

    @JsonIgnore 
    public int getGrade() { 
     return subclass.grade; 
    } 

    public class Subclass { 
     private int age; 
     private int grade; 

     public int getAge() { 
      return age; 
     } 

     public void setAge(int age) { 
      this.age = age; 
     } 

     public int getGrade() { 
      return grade; 
     } 

     public void setGrade(int grade) { 
      this.grade = grade; 
     } 
    } 
} 

現在,請看看我的簡單的main方法:

ObjectMapper mapper = new ObjectMapper(); 
ProfilerTask task = new ProfilerTask("test task", 1372771395040L, 25, 4); 

System.out.println(mapper.writeValueAsString(task)); 

這個程序打印:

{"name":"test task","createdOn":1372771395040,"subclass":{"age":25,"grade":4}} 

我覺得這是創建子元素的最簡單方法在與傑克遜的JSON中。

+1

好主意。謝謝! – damluar

+0

我很高興能幫上忙。 –