2013-07-02 2 views
1

저는 Jackson을 사용하고 있으며 하위 클래스의 필드를 하위 요소로 직렬화하려고합니다. 불행히도 잭슨은 끔찍한 기록을 가지고 있습니다. 실제로 서브 클래스의 필드는 하위 요소가되고 싶어요 동안, {"name":"test task","createdOn":1372771395040,"age":25,"grade":4} :하위 클래스로 서브 클래스 직렬화

@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; 
    } 

} 

나는이납니다.

+0

하위 요소를 갖고 싶으면 상속 대신 컴포지션을 사용해야합니다. –

+0

안녕하세요, 어떻게 든 잭슨이 현재 레벨이 아닌 1 레벨 아래에 필드를 쓰라고 말할 수 있습니까? – damluar

답변

1

저는 상속이 아닌 구성에 대해 생각해야한다고 생각합니다. 하지만 실제로 상속을 원한다면 POJO 클래스를 변경해야합니다. 새 내부 클래스를 만들고 모든 속성과 필드를이 새 클래스로 이동할 수 있습니다. 나는이 하위 요소를 만들 수있는 가장 간단한 방법이라고 생각

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

:

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

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

이 프로그램은 인쇄 :

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; 
     } 
    } 
} 

지금, 내 간단한 주요 방법을 참조하십시오 : 내 예를 참조하십시오 Jackson과 JSON에서

+1

좋은 아이디어. 고맙습니다! – damluar

+0

내가 도울 수있어서 기쁩니다. –

관련 문제