Android で取得したJSONObjectは順番通りに並ばない

いや、べつにAndroidに限った話ではなくて、JSONのオブジェクト ”{” と ”}” で囲まれたやつは
同一オブジェクト内では順序は保証されないみたいです。
たとえば、

{
	"Data1":[
		{"url" : "http://validator.w3.org/", "name" : "w3c validator"}
	],
	"Data2":[
		{"url" : "https://jigsaw.w3.org/css-validator", "name" : "w3c css validator"}
	]
}

このようなJSONデータの場合は、Data1とData2は”{” と ”}”で囲まれているキー名ですので
整形時に順序は保証されません。Data2が先に来ることもあれば、Data1が先にくることもあります。
(もちろん中にあるurlとnameも順序は保証されていません)


Android(Java)で処理をする場合は、JSONobjectのkeys()メソッドを呼んでIteratorで管理しますが
Iteratorには順序をどうこうするメソッドは実装されていません。
こんな時、死ぬほど順番通り処理させたい場合はどうするかというと、
JSONobjectではなくJSONArrayにすれば順番通りに処理されます。(というか処理させます)
JSONオブジェクトは”{” と ”}”で囲まれているものですが、JSON配列は “[” と “]” で囲まれています。
先ほどの例の場合だと、一番外側の括弧を配列のモノに置き換えて処理すれば大丈夫です。
(ただし、キーと配列のペアをうまく認識させるために中の要素をオブジェクト化する必要がある)

[
	{
		"Data1":[
			{"url" : "http://validator.w3.org/", "name" : "w3c validator"}
		]
	},
	{
		"Data2":[
			{"url" : "https://jigsaw.w3.org/css-validator", "name" : "w3c css validator"}
		]
	}
]

AndroidのVolleyで処理する場合はルート要素がオブジェクトだろうが配列だろうが処理できますので
new JsonArrayRequest(url, new Response.Listener) で処理を始めれば大丈夫です。


コメントを残す