こんにちは、さるまりんです。
こんな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-id
、name
、rank
の順に表示したいです。
@JsonProperty
アノテーションのindex
で順序を指定
@JsonProperty
ではindex
を指定できます。ドキュメントにはこうあります。
Property that indicates numerical index of this property (relative to other properties specified for the Object).
「このプロパティの数値インデックスを観プロパティ。(オブジェクトに指定された他のプロパティに対して)」
自分なりに訳してみました。簡単に考えると「プロパティのインデックス」なので「そのプロパティがオブジェクトの中で何番目になるか?」ということです。
ですので、こんな風に指定してみました。
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-id
、name
、rank
の順番に並びました。
@JsonPropertyOrder
はその名の通り、プロパティ名の順序(Order)を指定するものなので、本来はこちらを使うのが自然なのかもしれないですね。
ちなみに表示に使ったプログラムはこれ↓です。
ObjectA objA = new ObjectA();
objA.setUserId("ur-1xx1");
objA.setName("さるまりん");
objA.setRank(5);
System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(objA));
ちょっとしたことなのですが、プロパティの順序が重要な時はこうやって指定できることを覚えておくと便利かもしれません。
読んでくださってありがとうございます。
それではまた!