JSON シリアライズ時のソート

Java Jackson を使用した時のシリアライズのソートの話である。
@JsonPropertyOrder を使わないで、ObjectMapper の設定として指定する方法

Java Object プロパティ順(フィールド宣言順)
Jackson version >= 2.6.1

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);

アルファベット順

// @deprecated Since 2.13 use {@code JsonMapper.builder().configure(...)}
mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);

バージョン 2.13 以降では、MapperFeature そのものが @Deprecated なのではなく
configure メソッドで、MapperFeature を指定することが @Deprecated になっている。

代わりに、アルファベット順を指定できる方法は、SerializationFeature では
アルファベット順指定が存在しないので、SerializationConfig を取得して
MapperFeature.SORT_PROPERTIES_ALPHABETICALLY でセットして再セットする。

mapper.setConfig(
   mapper.getSerializationConfig()
   .with(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY)
);


Java Object プロパティ順(フィールド宣言順)も同じよう設定するなら
MapperFeature.SORT_CREATOR_PROPERTIES_FIRST でセットして再セットする。

mapper.setConfig(
   mapper.getSerializationConfig()
   .with(MapperFeature.SORT_CREATOR_PROPERTIES_FIRST)
);


整形してシリアライズ

DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter("    ", DefaultIndenter.SYS_LF);
DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
printer.indentObjectsWith(indenter);
printer.indentArraysWith(indenter);

String res = mapper.writer(printer).writeValueAsString(object);