Reihenfolge der JSON-Objekte mit Jacksons ObjectMapper

90

Ich verwende ObjectMapper , um mein Java-JSON-Mapping durchzuführen.

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

Das ist meine Java-Klasse:

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

}

das bekomme ich:

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

Meine Frage ist nun, wie kann ich diese JSON-Ausgabe erhalten:

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

  }

Ich möchte es in der gleichen Reihenfolge wie in meiner Java-Erklärung. Gibt es eine Möglichkeit, dies anzugeben? Vielleicht mit Anmerkungen oder so?

sagte nur
quelle
2
Die signifikante Reihenfolge der Eigenschaften weist auf einen Code- / Designgeruch hin. Was auch immer den JSON verbraucht, sollte sich nicht um die Reihenfolge kümmern (listet Ja, Eigenschaften Nein auf).
Ach
24
Ich brauche es nur aus Gründen der Lesbarkeit :-)
justSaid
10
@ach das stimmt einfach nicht. Eine geordnete Karte ist ein sehr häufiger und sehr nützlicher Datentyp. Wunschordnung ist überhaupt kein Geruch.
Ziege

Antworten:

190
@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }
Andrey Atapin
quelle
@justSaid, was meinst du? Möchten Sie die Felder der Listenelemente auf die gleiche Weise sortieren?
Andrey Atapin
4

Wissen Sie, dass es eine bequeme Möglichkeit gibt, die alphabetische Reihenfolge festzulegen?

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

Wenn Sie spezielle Anforderungen haben, konfigurieren Sie hier die benutzerdefinierte Bestellung:

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

Sie können verwenden @XmlAccessorType(XmlAccessType.FIELD)

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

@JsonPropertyOrder erfordert das Hinzufügen eines neuen Glases.

user1001
quelle
3
@JsonPropertyOrder benötigt kein neues Glas, denn wenn Sie Jackson verwenden, ist es bereits enthalten.
Patrick
1
Dies hängt von dem Framework ab, das Sie verwenden. Wenn Sie Jackson nicht verwenden, ist es besser, mit der obigen Implementierung fortzufahren, die sowohl für JSON als auch für XML gilt und keine zusätzliche Konfiguration erfordert, wenn Sie Daten im XML-Format zurückgeben
möchten
Ja, aber die Frage wurde mit Jackson gestellt. Wenn Sie eine Lösung ohne Verwendung von Jackson bereitstellen möchten, müssen Sie in Ihrer Antwort spezifischer sein.
Patrick