ジャクソンのObjectMapperを使用したJSONオブジェクトの順序


91

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を消費するものは何でも、順序を気にする必要はありません(リストはyes、プロパティはno)。
2013年

24
読みやすくするために必要なだけです:-)
justSaid

10
@achそれは真実ではありません。順序付きマップは非常に一般的で、非常に便利なデータ型です。注文を希望することは、匂いではありません。
ヤギ

回答:



4

アルファベット順を指定する便利な方法があることを知っていますか?

@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 新しいjarを追加する必要があります。


3
@JsonPropertyOrderは新しいjarを必要としません。なぜなら、Jacksonを使用する場合、すでに含まれているためです。
Patrick

1
これは、使用しているフレームワークによって異なります。jacksonを使用しない場合は、jsonとxmlの両方に適用される上記の実装を使用することをお勧めします
。xml

はい、しかし、質問はジャクソンを使って尋ねられました。ジャクソンを使用せずにソリューションを提供したい場合は、答えをもっと具体的にする必要があります。
Patrick
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.