3

JSONデコードされた値が元の入力と一致するように、インデックス付き配列をエンコードおよびデコードできます。

$array_indexed = ['A'];
$encoded = json_encode($array_indexed); 
$decoded = json_decode($encoded);
var_dump($array_indexed);
array(1) {
  [0]=>
  string(1) "A"
}
var_dump($decoded);
array(1) {
  [0]=>
  string(1) "A"
}

ただし、関連付けられた配列をエンコードすると、最終的にオブジェクトになります。

$array_associate = [ 'FOO' => 'BAR'];
$encoded = json_encode($array_associate);
$decoded = json_decode($encoded);
var_dump($array_associate);
array(1) {
  ["FOO"]=>
  string(3) "BAR"
}
var_dump($decoded);
object(stdClass)#1 (1) {
  ["FOO"]=>
  string(3) "BAR"
}

私の理解では、Javascriptオブジェクトを使用して代わりに表される関連配列をサポートしていないため、これは通常の動作であり、したがって、関連配列をエンコードすると、オブジェクトとしてエンコードされます (したがって、そのようにデコードされます)。

Q1: 確認できますか?

可能な解決策

serialize/ unserialize:絶対に/で/
を使用したい理由は、エンコードされた形式がはるかに簡潔であるためです。これは、最終的にキャッシュに格納され、キャッシュ スペースが限られているため重要です。json_encodejson_decodeserializeunserialize

var_dump(json_encode(['A'=>1,'B'=>2])); // string(13) "{"A":1,"B":2}"
var_dump(serialize(['A'=>1,'B'=>2])); //   string(30) "a:2:{s:1:"A";i:1;s:1:"B";i:2;}

Q2: を使用してキャッシュ スペースの問題に直面しserializeたことがありますか? もしそうなら、使用する以外にどのように対処しましたかjson_encode?それと)?

json_decode($json,true):
問題は、オブジェクトのままであるべきネストされたオブジェクトも配列に変換されることです。

$obj = new stdClass;
$obj->foo = 'bar';
$array_associate = [ 'A' => $obj];
$encoded = json_encode($array_associate);
var_dump(json_decode($encoded,true));
array(1) {
  ["A"]=>
  array(1) {     <---------------- NO LONGER AN OBJECT, DON'T WANT THAT
    ["foo"]=>
    string(3) "bar"
  }
}

オブジェクトのオブジェクトをオブジェクトの配列に変換します。

引き続き上記の例に基づいて

$object_of_objects = json_decode($encoded);
$array = [];
foreach($object_of_objects as $key=>$object) {
    $array[$key] = $object;
}
var_dump($array);
array(1) {                
  ["A"]=>
  object(stdClass)#6 (1) {
    ["foo"]=>
    string(3) "bar"
  }
}

JSONQ3:元の入力を保持しながら、オブジェクトの関連配列を相互に変換する他のソリューションはありますか?

4

2 に答える 2

4

連想配列は json では書けないので、オブジェクトとして書かれるので、PHP はそれをデコードするときにオブジェクトとしてリードします。

PHP に配列として読み取らせるには、 の 2 番目のパラメーターjson_decodeを trueに設定する必要があります。

json_decode($json, true)
                   ^^^^
于 2012-10-23T09:58:21.650 に答える
2

Q1: はい、PHP 連想「配列」(実際には厳密に言えば配列ではありません) は、JSON に変換されるときに Javascript オブジェクトに変換されます。なぜこれがあなたにとって問題なのですか?

Q2: JSON はより簡潔であるだけでなく、より広くサポートされており、UTF-8 でエンコードされたテキストを使用する際に問題がないため、シリアル化されたものよりも JSON を使用します。

JS オブジェクトを配列に変換したくない場合はjson_decode()、2 番目のパラメーターを false に設定します。

質問 (耳障りな言い方ではありません): なぜ、配列よりもオブジェクトにこだわるのですか? PDOのような DB 抽象化レイヤーであっても、PHP で後者を操作するのは非常に簡単です。

于 2012-10-23T09:57:36.687 に答える