1

Jackson を使用しており、サブクラスのフィールドをサブ要素にシリアライズしたいと考えています。残念ながら、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}、実際にはサブクラスのフィールドをサブ要素にしたいのですが。

4

1 に答える 1

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

さて、私の簡単な主な方法を見てください:

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 にサブ要素を作成する最も簡単な方法だと思います。

于 2013-07-02T21:55:59.067 に答える