Jackson JSON: ทำให้คุณสมบัติบางอย่างเป็นอนุกรมภายใต้มุมมองที่แตกต่างกันหรือไม่

ถ้าฉันมีคลาสชื่อ "TreeNode" พร้อมด้วยตัวแปรอินสแตนซ์ (รวมถึงตัวอื่น ๆ ) ที่เรียกว่า "children" ซึ่งเป็นอาร์เรย์ของ TreeNodes อื่น ๆ มีวิธีใดบ้างที่ฉันสามารถซีเรียลไลซ์อินสแตนซ์ TreeNode ภายใต้ JsonView เดียว แต่ทำให้ซีเรียลไลซ์ทั้งหมด TreeNodes ในอาร์เรย์ "children" ของฉันภายใต้ JsonView อื่น

สิ่งที่ฉันพยายามทำให้สำเร็จคือ: เมื่อฉันซีเรียลไลซ์ TreeNode เดียว ฉันต้องการให้คุณสมบัติทั้งหมดใน TreeNode นั้นถูกซีเรียลไลซ์ รวมถึงรายการลูก ๆ ของมันด้วย แต่ฉันไม่ต้องการให้คุณสมบัติทั้งหมดของลูก ๆ กลายเป็นซีเรียลไลซ์ (เช่น อาร์เรย์ "children" ของเด็ก) โดยพื้นฐานแล้วถ้าฉันทำให้ TreeNode เป็นอนุกรม ฉันเพียงต้องการเห็น TreeNode นั้นและลูก ๆ ลงหนึ่งระดับเท่านั้น นอกจากนี้ยังมีคุณสมบัติอื่นๆ ในชายด์ที่ฉันต้องการซ่อน เฉพาะเมื่อมีการทำให้เป็นอนุกรมโดยเป็นส่วนหนึ่งของอาร์เรย์ "เด็ก" เท่านั้น

มีวิธีใดบ้างที่ฉันสามารถบรรลุสิ่งนี้ด้วย JsonViews หรือฟีเจอร์ Jackson อื่น ๆ ขอบคุณ


person 755    schedule 26.07.2013    source แหล่งที่มา
comment
ฉันตอบคำถามเกี่ยวกับเรื่องนี้มาระยะหนึ่งแล้ว อาจช่วยได้ไหม stackoverflow.com/ คำถาม/14774909/ - คุณสามารถคลาสย่อยโดยใช้ JsonViews (จริงๆ แล้ว อ่านซ้ำ ... เนื่องจากเป็นการอ้างอิงแบบเรียกซ้ำ ฉันไม่รู้ว่ามันจะเป็นเช่นนั้น)   -  person Brian Roach    schedule 26.07.2013


คำตอบ (1)


สำหรับตรรกะการทำให้เป็นอนุกรมที่กำหนดเอง คุณจะต้องใช้ JsonSerializer ของคุณเอง

ตัวอย่างเช่น:

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