このようなクラスオブジェクトが存在したとします。
import java.io.Serializable; import lombok.Data; @Data public class Person implements Serializable{ private static final long serialVersionUID = 1L; private String name; private String alias; private int id; private int age; }
これを、Jackson ObjectMapper でシリアライズすると以下のようになります
インデントを指定してシリアライズ実行
ObjectMapper mapper = new ObjectMapper(); DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter(" ", DefaultIndenter.SYS_LF); DefaultPrettyPrinter printer = new DefaultPrettyPrinter(); printer.indentObjectsWith(indenter); printer.indentArraysWith(indenter); // person = Person オブジェクト生成済 String json = mapper.writer(printer).writeValueAsString(person); System.out.println(json);
{ "name" : "佐藤", "alias" : "sato", "id" : 104, "age" : 50 }
でも、これを
id → name → alias → age
の順、=任意の順にしたい時は、JsonProperty で、index を指定します。
ここに JavaDoc があります。
JsonProperty (Jackson-annotations 2.13.0 API)
import com.fasterxml.jackson.annotation.JsonProperty; import java.io.Serializable; import lombok.Data; @Data public class Person implements Serializable{ private static final long serialVersionUID = 1L; @JsonProperty(index=1) private String name; @JsonProperty(index=2) private String alias; @JsonProperty(index=0) private int id; @JsonProperty(index=3) private int age; }
すると、以下のとおり期待どおりになります
{ "id" : 104, "name" : "佐藤", "alias" : "sato", "age" : 50 }
もう1つ、クラスに @JsonPropertyOrder で、プロパティ名(JSONキー)の順列を書く方法もあります。
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.Data; @Data @JsonPropertyOrder({"id", "name", "alias", "age"}) public class Person implements Serializable{ private static final long serialVersionUID = 1L; private String name; private String alias; private int id; private int age; }
こちらの方が楽な気もします。
@JsonPropertyOrder(alphabetic=true) ならアルファベット順になります、