2013-06-01 2 views
18

私はJavaプログラム内で構築したJSONオブジェクトを持っています。値のシーケンスはJSONオブジェクトで重要ですか?

このオブジェクトは、次のタイプのJSONオブジェクトが必要なサーバーに送信しています。

{"BBB:bbb", "AAA:aaa", "CCC:ccc"} 

私の質問は、JSONオブジェクトの順序は本当にサーバー側で重要なのですか?はいの場合、どのように注文を変更できますか?

+0

あなたが直面している問題は何ですか?エラーまたは例外はありますか? –

+3

JSON RFC(RFC 4627)では、オブジェクトメンバーの順序は関係ありません。 – fge

+1

Googleが私をここに連れて来るときの将来の自己への注意:MongoDBは、オブジェクトの等価性をチェックするときにキーの順序に敏感です。 _id:{key1: "foo"、key2: "bar"}の文書を持っている場合、find({_ id:{key2: "bar"、key1: "foo"}})でそれを見つけることはできません。 – ahains

答えて

24

私の質問は、JSONオブジェクトの順序がサーバー側で本当に重要なのでしょうか?

ではありません。さまざまなJSON仕様によれば、属性の順序は重要ではありません。例:

"オブジェクトは名前と値のペアの順序付けられていないセットです。" (ソースはjson.org

"オブジェクトは、名前が文字列で値が文字列、数値、ブール値、ヌル、オブジェクト、または配列の場合、0以上の名前と値のペアの順序付けられていないコレクションです。 (出典RFC 7159

残念ながら、スペックの側面を無視して、属性の順序に何らかの意味を置き、そこ nitwitsがあります。 (間違いは、APIを指定する人々とそれらを実装する人々の間の接続が切断され、仕様作業を行っている人がJSONを本当に理解していないときに行われるのが普通です。)

幸いにも、実装されたサーバーは間違いを起こさなかった。私が遭遇したすべてのJava JSONパーサーは、解析時に属性の順序を保持しません。デフォルトではです。 偶発的には、解析されるJSON属性の順序が重要なサーバーを実装するのは難しいでしょう。

はいの場合、どのように注文を変更できますか?難しさと

、私は恐れる:

  • あなたが手でJSONを生成することができます。
  • 少なくとも1つのJava実装用JSON があり、JSONオブジェクトの属性を保持するオブジェクトMapを提供できます。 LinkedHashMapまたはTreeMapを使用する場合は、挿入順序または属性キーの字句順を保持する必要があります。

1 - たとえば、この貧しい開発者がのために働いていたことをnitwits ... https://stackoverflow.com/a/4515863/139985

2 - RFC 7159にもこれを言う:「JSONの構文解析ライブラリがに観察されています動作がメンバの順序に依存しない実装は、これらの違いの影響を受けないという意味で相互運用性があります。 "は、オブジェクトメンバの順序付けを呼び出し側のソフトウェアに見せるかどうかによって異なります。私の読んだところでは、JSONライブラリのアプリケーションコードからのペアの順序を隠すべきであることをお勧めします。

3 - JSON-simple:https://code.google.com/p/json-simple/。他にも存在する可能性があります。

+0

あなたの記述的な情報をありがとう。うん、それはサーバー側のエラーだった。 –

+0

読者には分かりやすくするために、この回答に「注文は関係ありません」というJSON仕様の抜粋が追加されていれば役に立ちます。 –

+0

更新............ –

9

IMHOです。

JSON docs

オブジェクトは、名前/値ペア

ので仕方が必要な順序で値を取得するのではなく、あなたは可能性がjson

1

を注文されたの順不同の集合であると言いますあなたのサーバがそれを受け入れることができると仮定して、リストを使用してください:

{"list": [ {"AAA":"aaa"},{"BBB":"bbb"},{"CCC":"ccc"}]} 
-1
public static void jsonpdf() 
{ 
    LinkedHashMap<String,String> lm = new LinkedHashMap<>(); 
    lm.put("BBB","bbb"); 
    lm.put("AAA","aaa"); 
    lm.put("CCC","ccc"); 
    Gson gson = new Gson(); 
    String json = gson.toJson(lm); 
    System.out.println(json); 
} 
0

実際にJSONオブジェクトのフィールドの順序は重要です。使用しているシリアライザによって異なります。たとえば、継承したオブジェクトを直列化すると、type = ''という余分なJSONフィールドが得られます。それを逆シリアル化するときには、型フィールドは他のJSONフィールドの前に来なければなりません。それ以外の場合は、親の型をとります。

関連する問題