JsonicでオブジェクトをJSON化した時にメンバ変数の順序が変わる件

java

サーバ間のやりとりでJSONを使っているシステムは多いと思います。
オブジェクトをJSONへエンコードする際に、ライブラリJsonicを使っている方も多いはずです。

jsonicの仕様で気になったことがありました。
オブジェクトをJSONへエンコードした際に、オブジェクトとJSONでメンバ変数の順序が変わっていました。
ブログにまとめていきます。

[スポンサーリンク]

この章でやること

オブジェクトをJSONへエンコードした際の挙動を紹介します。
オブジェクトとJSONでメンバ変数の順序を同じにするための代替案を紹介します。

JsonicでオブジェクトをJSONにエンコードする

public class JsonicSortService {

    /**
     * JSONへエンコードするObjectです。
     *
     */
    private static class Json {
        public String CCC;
        public String BBB;
        public String AAA;
       
    }

    /**
     * Objectからテキスト(JSON)に変更します。
     */
    public static void main(String arg[]) {
    	Json jsonObject = new Json();
    	jsonObject.CCC = "test1";
    	jsonObject.BBB = "test2";
    	jsonObject.AAA = "test3";

    	String jsonText = JSON.encode(jsonObject);
    	System.out.println(jsonText);
    }
    
}

実行結果

>実行結果
{"AAA":"test3","BBB":"test2","CCC":"test1"}

解説

オブジェクトのメンバ変数の並びは、「CCC、BBB、AAA」の順です。
jsonicを使って、JSONへエンコードしたら、JSONの項目の並びが、「AAA、BBB、CCC」とアルファベット順に変わっています。

もし順序を変えたくないのであれば、jsonic以外のライブラリを使うことをおススメします。
検証した結果、Googleの提供している、Gsonであれば、並びを同じにすることが可能でした。
次にGsonの使い方を紹介していきます。

GsonでオブジェクトをJSONにエンコードする

public class GsonSortService {

    /**
     * JSONへエンコードするObjectです。
     *
     */
    private static class Json {
        public String CCC;
        public String BBB;
        public String AAA;
       
    }

    /**
     * Objectからテキスト(JSON)に変更します。
     */
    public static void main(String arg[]) {
    	Json jsonObject = new Json();
    	jsonObject.CCC = "test1";
    	jsonObject.BBB = "test2";
    	jsonObject.AAA = "test3";

    	String jsonText = new Gson().toJson(jsonObject);
    	System.out.println(jsonText);
    }
}

実行結果

>実行結果
{"CCC":"test1","BBB":"test2","AAA":"test3"}

解説1

GsonでオブジェクトをJSONへエンコードした結果は、オブジェクトのメンバ変の並びとJSONの項目の並びが同じになりました。

最後に

オブジェクトの並びとJSONの項目の並びを一緒にしなければいけない。という制約自体がイケていない気がします。
それでもプロジェクトによっては、この制約を満たさなければいけないという時は、Gsonを使うことで回避しましょう。
それでは!