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_encode/ json_decodeover serialize/的原因unserialize是编码形式更加简洁,这很重要,因为它最终存储在缓存中并且缓存空间有限:

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(我在想压缩,但如果 value 最终出现在 MySQL DB 缓存中,我有点不安用它)?

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"
  }
}

Q3:您是否看到任何其他解决方案可以JSON在保留原始输入的同时将关联的对象数组相互转换?

4

2 回答 2

4

由于无法在 json 中编写关联数组,因此它将被编写为对象,因此 PHP 将在您解码时将其重新作为对象。

为了使 PHP 将其作为数组读取,您必须将第二个参数设置json_decode为 true

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

Q1:是的,PHP 关联“数组”(严格来说实际上不是数组)在转换为 JSON 时会转换为 Javascript 对象。为什么这对你来说是个问题?

Q2:我会使用 JSON 而不是序列化,不仅因为它更简洁,而且因为它受到更广泛的支持,并且在使用 UTF-8 编码文本时没有问题。

如果您不想json_decode()将 JS 对象转换为数组,请将第二个参数设置为 false。

问题(不是听起来刺耳的意思):为什么你如此沉迷于阵列上的对象?在 PHP 中使用后者非常容易,即使在像PDO这样的 DB 抽象层中也是如此。

于 2012-10-23T09:57:36.687 回答