Jackson JSON: Membuat serial properti tertentu dalam tampilan berbeda?

jika saya memiliki kelas bernama "TreeNode" dengan variabel instan (antara lain) yang disebut "anak-anak", yang merupakan array dari TreeNode lainnya, apakah ada cara agar saya dapat membuat serial instance TreeNode di bawah satu JsonView, tetapi membuat serial semua TreeNodes di array "anak-anak" saya di bawah JsonView yang berbeda?

Apa yang ingin saya capai adalah: ketika saya membuat serialisasi satu TreeNode, saya ingin semua properti di TreeNode itu diserialkan, termasuk daftar turunannya, tetapi saya tidak ingin semua properti turunannya diserialisasikan (seperti array "anak-anak" anak). Pada dasarnya jika saya membuat serial TreeNode, saya hanya ingin melihat TreeNode dan anak-anak satu tingkat di bawah. Ada juga properti lain di anak-anak yang ingin saya sembunyikan, hanya jika properti tersebut diserialkan sebagai bagian dari array "anak-anak".

Apakah ada cara saya dapat mencapai hal ini dengan JSONViews atau fitur Jackson lainnya? Terima kasih


person 755    schedule 26.07.2013    source sumber
comment
Saya menjawab pertanyaan tentang ini beberapa waktu lalu, mungkin bisa membantu? stackoverflow.com/ question/14774909/ - Anda dapat membuat subkelas menggunakan JsonViews (Sebenarnya, membaca ulang ... karena ini adalah referensi rekursif, saya tidak tahu apakah itu akan terjadi)   -  person Brian Roach    schedule 26.07.2013


Jawaban (1)


Untuk logika serialisasi khusus, Anda harus mengimplementasikan JsonSerializer Anda sendiri.

Misalnya:

public class TreeNodeSerializer extends JsonSerializer<TreeNode> {

    @Override
    public void serialize(TreeNode value, JsonGenerator generator,
                          SerializerProvider provider) throws IOException,             JsonProcessingException {

        generator.writeStartObject();
        generator.writeStringField("value", value.getValue());
        generator.writeNumberField("numValue", value.getNumValue());

        generator.writeArrayFieldStart("children");
        for(TreeNode child : value.getChildren()) {
            generator.writeStringField("value", child.getValue());
            generator.writeNumberField("numValue", child.getNumValue());
        }
        generator.writeEndArray();

        generator.writeEndObject();
    }
}
person Vivin Paliath    schedule 26.07.2013