ลำดับของวัตถุ JSON โดยใช้ ObjectMapper ของ Jackson


92

ฉันใช้ObjectMapperเพื่อทำการแมป java-json

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
ow.writeValue(new File( fileName +".json"), jsonObj);

นี่คือคลาส java ของฉัน:

public class Relation {

private String id;
private String source;
private String target;
private String label;
private List<RelAttribute> attributes;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getSource() {
    return source;
}

public void setSource(String source) {
    this.source = source;
}

public String getTarget() {
    return target;
}

public void setTarget(String target) {
    this.target = target;
}

public String getLabel() {
    return label;
}
public void setLabel(String label) {
    this.label = label;
}

public void setAttributes(List<RelAttribute> attributes) {
    this.attributes = attributes;
}

public List<RelAttribute> getAttributes() {
    return attributes;
}

}

นี่คือสิ่งที่ฉันได้รับ:

{
    "id" : "-75da69d3-79c8-4000-a3d8-b10350a57a7e",
    "attributes" : [ {
      "attrName" : "ID",
      "attrValue" : ""
    }, {
      "attrName" : "Description",
      "attrValue" : "Primary Actor"
    }, {
      "attrName" : "Status",
      "attrValue" : ""
    } ],
    "label" : "new Label",
    "target" : "-46b238ac-b8b3-4230-b32c-be9707f8b691",
    "source" : "-daa34638-061a-45e0-9f2e-35afd6c271e0"
  }

ดังนั้นคำถามของฉันตอนนี้คือฉันจะรับเอาต์พุต json นี้ได้อย่างไร:

{
    "id" : "-75da69d3-79c8-4000-a3d8-b10350a57a7e",
    "label" : "new Label",
    "target" : "-46b238ac-b8b3-4230-b32c-be9707f8b691",
    "source" : "-daa34638-061a-45e0-9f2e-35afd6c271e0",
    "attributes" : [ {
      "attrName" : "ID",
      "attrValue" : ""
    }, {
      "attrName" : "Description",
      "attrValue" : "Primary Actor"
    }, {
      "attrName" : "Status",
      "attrValue" : ""
    } ]

  }

ฉันต้องการด้วยลำดับเดียวกันกับในการประกาศ java ของฉัน มีวิธีระบุหรือไม่ อาจจะมีคำอธิบายประกอบหรืออะไรทำนองนั้น?


2
ลำดับคุณสมบัติเป็นจุดสำคัญของรหัส / กลิ่นการออกแบบ สิ่งใดก็ตามที่ใช้ JSON ไม่ควรสนใจคำสั่งซื้อ (แสดงรายการใช่ไม่ใช่คุณสมบัติ)
ACH

26
ฉันแค่ต้องการมันเพื่อประโยชน์ในการอ่าน :-)
justSaid

11
@ แต่ละที่ไม่เป็นความจริง แผนที่ตามลำดับเป็นชนิดข้อมูลที่ใช้กันทั่วไปและมีประโยชน์มาก คำสั่งที่ต้องการไม่ใช่กลิ่นเลย
แพะ

คำตอบ:


194
@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }

@justSaid คุณหมายถึงอะไร? คุณต้องการจัดเรียงฟิลด์ขององค์ประกอบรายการด้วยวิธีเดียวกันหรือไม่
Andrey Atapin

5

คุณรู้หรือไม่ว่ามีวิธีที่สะดวกในการระบุลำดับตัวอักษร?

@JsonPropertyOrder(alphabetic = true)
public class Relation { ... }

หากคุณมีข้อกำหนดเฉพาะต่อไปนี้เป็นวิธีกำหนดค่าลำดับที่กำหนดเอง:

@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }

3

คุณสามารถใช้ได้ @XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "response", propOrder = { "prop1", "prop2",
        "prop3", "prop4", "prop5", "prop6" }).

@JsonPropertyOrder ต้องเพิ่มโถใหม่


3
@JsonPropertyOrder ไม่ต้องใช้โถใหม่เพราะถ้าคุณใช้แจ็คสันมันรวมอยู่แล้ว
Patrick

1
ขึ้นอยู่กับเฟรมเวิร์กที่คุณใช้อยู่หากคุณไม่ได้ใช้แจ็คสันคุณควรใช้การใช้งานข้างต้นซึ่งจะใช้ได้กับทั้ง json และ xml และไม่จำเป็นต้องกำหนดค่าเพิ่มเติมหากคุณต้องการส่งคืนข้อมูลในรูปแบบ xml
user1001

ใช่ แต่คำถามถูกถามโดยใช้แจ็คสัน หากคุณต้องการหาวิธีแก้ปัญหาโดยไม่ใช้แจ็คสันคุณต้องมีความชัดเจนมากขึ้นในคำตอบของคุณ
Patrick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.