php の json_encode で、処理対象のオブジェクトを json の array 型とするか object 型とするかの判断を、 php の array (振る舞いとして配列、連想配列、オブジェクトとなるそれ)について、 key が 0 から連続した数値になっていれば json の array 型へ、そうでなければ json の object 型へ変換する実装になっているため。
少し荒っぽい方法として php-5.3 以降の場合 json_encode に JSON_FORCE_OBJECT を第二実引数で渡すと全てを json の object 型に変換するのでパースの都合インデックスが必要な場合にも対処が楽になるかも。
あるいは、必要な部分だけ json にも object 型として渡したい場合には、(object)array('aaa','bbb','ccc') としてオブジェクト型に明示的にキャストして json_encode に渡しても、生成される json を object 型にできます。
具体的な php の実装詳細としては、 php ソースの ext/json/json.c の json_encode_array 関数のはじめの辺りで、処理対象の php オブジェクトが配列か連想配列(オブジェクト)か判断しています。
判断は、 PHP_JSON_FORCE_OBJECT が php の関数呼び出しの第二引数に定義され渡されて来ていればオブジェクトとして、そうでない場合には json_determinate_array_type 関数によって行っています。
json_determinate_array_type 関数では渡されたphpの配列ともオブジェクトとも未判断のオブジェクトに対して key を 0 番目の要素から順に取り出し、それが「数値かつ要素の順序と一致」ではないところがあればオブジェクト(PHP_JSON_OUTPUT_OBJECT)として判断し、全ての key が「数値かつ要素の順序と一致」している事が確かめられれば配列(PHP_JSON_OUTPUT_ARRAY)として判断します。
以上の実装詳細により、 php の json_encode に質問に例示されたような array を渡した場合に、 json に配列として、あるいはオブジェクトとして出力されるかの挙動が決定されています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/07/24 04:15