Java:JSONでプロパティの順序を決める方法

こんにちは、さるまりんです。

こんなJavaクラスがあります。

public class ObjectA {

    @JsonProperty("name")
    String name;

    @JsonProperty("user-id")
    String userId;

    @JsonProperty("rank")
    int rank;
}

(アクセサは省略しています。)

これをJacksonのObjectMapperを使ってJSON文字列にするとこんなふうになります。

{
  "name" : "さるまりん",
  "user-id" : "ur-1xx1",
  "rank" : 5
}

これをuser-idnamerankの順に表示したいです。

@JsonPropertyアノテーションのindexで順序を指定

@JsonPropertyではindexを指定できます。ドキュメントにはこうあります。

Property that indicates numerical index of this property (relative to other properties specified for the Object).

https://fasterxml.github.io/jackson-annotations/javadoc/2.4/com/fasterxml/jackson/annotation/JsonProperty.htmlより

「このプロパティの数値インデックスを観プロパティ。(オブジェクトに指定された他のプロパティに対して)」

自分なりに訳してみました。簡単に考えると「プロパティのインデックス」なので「そのプロパティがオブジェクトの中で何番目になるか?」ということです。

ですので、こんな風に指定してみました。

public class ObjectA {

    @JsonProperty(value= "name", index=1)
    String name;

    @JsonProperty(value = "user-id", index=0)
    String userId;

    @JsonProperty(value = "rank", index = 2)
    int rank;
}

それぞれのプロパティに対してindexで何番目にあたるのかを指定しています。

文字列にしてみるとこうなります。

{
  "user-id" : "ur-1xx1",
  "name" : "さるまりん",
  "rank" : 5
}

順序が変わりました。

@JsonPropertyOrderアノテーションで順序を指定する

もう一つの方法は、@JsonPropertyOrderにプロパティ名の配列を設定してプロパティの順序を指定します。

@JsonPropertyOrder({"user-id", "name", "rank"})
public class ObjectA {

    @JsonProperty("name")
    String name;

    @JsonProperty("user-id")
    String userId;

    @JsonProperty("rank")
    int rank;
}

classの定義に対して、{"プロパティ1", ... , "プロパティx"}と順番を指定しいます。

これで文字列にすると↓です。

{
  "user-id" : "ur-1xx1",
  "name" : "さるまりん",
  "rank" : 5
}

先ほどと同じようにuser-idnamerankの順番に並びました。

@JsonPropertyOrderはその名の通り、プロパティ名の順序(Order)を指定するものなので、本来はこちらを使うのが自然なのかもしれないですね。

ちなみに表示に使ったプログラムはこれ↓です。

ObjectA objA = new ObjectA();

objA.setUserId("ur-1xx1");
objA.setName("さるまりん");
objA.setRank(5);

System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(objA));

ちょっとしたことなのですが、プロパティの順序が重要な時はこうやって指定できることを覚えておくと便利かもしれません。

読んでくださってありがとうございます。

それではまた!