Urutan objek JSON menggunakan ObjectMapper Jackson

92

Saya menggunakan ObjectMapper untuk melakukan pemetaan java-json saya.

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

ini kelas java saya:

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

}

ini yang saya dapatkan:

{
    "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"
  }

Jadi pertanyaan saya sekarang adalah, bagaimana saya bisa mendapatkan output json ini:

{
    "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" : ""
    } ]

  }

Saya menginginkannya dengan urutan yang sama seperti dalam deklarasi java saya. Apakah ada cara untuk menentukannya? Mungkin dengan penjelasan atau semacamnya?

hanya mengatakan
sumber
2
Urutan properti menjadi poin penting untuk bau kode / desain. Apa pun yang mengonsumsi JSON seharusnya tidak peduli dengan urutannya (daftar ya, properti tidak).
ach
26
Saya hanya membutuhkannya agar mudah dibaca :-)
justSaid
11
@ach itu tidak benar. Peta terurut adalah tipe data yang sangat umum, dan sangat berguna. Menginginkan keteraturan bukanlah bau sama sekali.
kambing

Jawaban:

194
@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }
Andrey Atapin
sumber
@justSaid, apa maksudmu? Apakah Anda ingin mengurutkan bidang elemen daftar dengan cara yang sama?
Andrey Atapin
5

Tahukah Anda bahwa ada cara mudah untuk menentukan urutan abjad?

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

Jika Anda memiliki persyaratan khusus, berikut cara Anda mengonfigurasi pemesanan khusus:

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

Kamu bisa memakai @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder membutuhkan toples baru untuk ditambahkan.

pengguna1001
sumber
3
@JsonPropertyOrder tidak memerlukan jar baru karena jika Anda menggunakan jackson itu sudah disertakan.
Patrick
1
Itu tergantung pada kerangka kerja yang Anda gunakan.Jika Anda tidak menggunakan jackson maka lebih baik menggunakan implementasi di atas yang akan berlaku untuk json dan xml dan tidak perlu konfigurasi tambahan jika Anda ingin mengembalikan data dalam format xml
user1001
Ya, tapi pertanyaannya ditanyakan dengan menggunakan jackson. Jika Anda ingin memberikan solusi tanpa menggunakan jackson, Anda harus lebih spesifik dalam menjawabnya.
Patrick