起こったこと
js で API に問合せして JSON オブジェクトを受け取り、受け取った内容を <li>...</li>
で表示させる処理を実装しようとしていました。
API からは以下のようにキーが数値になっている JSON が返却されます。
.json
{
59: {"name": "Tシャツ", "category": 5, "price": 3000},
24: {"name": "ジャケット", "category": 12, "price": 12000},
75: {"name": "デニム", "category": 18, "price": 5000}
}
このとき、サーバー(PHP)で持っている連想配列の並び順のまま返却されると思っていました。
しかし返却された JSON を見ると以下のように順序が変わっていました。
.json
{
24: {"name": "ジャケット", "category": 12, "price": 12000},
59: {"name": "Tシャツ", "category": 5, "price": 3000},
75: {"name": "デニム", "category": 18, "price": 5000}
}
順番が変わる理由
下記のページが参考になりました。
言語の仕様によっては例外もあるようですが、JSON に限らずキー、バリューで表現されるデータ形式は順番を保証しないと考えるのがベターようです。
これはよく考えれば当たり前のことかもしれません。
配列の値にアクセスする場合は「X番目の値をください」と言って値を受け取るため、順番が非常に重要な要素となりますが、連想配列(JSON オブジェクト、ハッシュ、マップ、ディクショナリー...)は値を取り出すためのキーを自分で決めているため、順番がバラバラになっても本来問題ないはずです。
とはいえ、API から返却される JSON の順番がわざわざ変わるとは思っていなかったため、気づくまでに時間がかかりました。。