【问题标题】:Decode sparse json object to php array将稀疏 json 对象解码为 php 数组
【发布时间】:2011-01-29 21:28:30
【问题描述】:

我可以使用以下命令创建一个稀疏的 php 数组(或映射):

$myarray = array(10=>'hi','test20'=>'howdy');

我想将其序列化/反序列化为 JSON。我可以使用以下命令对其进行序列化:

$json = json_encode($myarray);

产生字符串{"10":"hi","test20":"howdy"}。但是,当我反序列化并使用以下命令将其转换为数组时:

$mynewarray = (array)json_decode($json);

我似乎丢失了任何带有无效 php 标识符的键的映射。也就是说,mynewarray 有映射'test20'=>'howdy',但没有10=>'hi' 也没有'10'=>'hi'

在使用标准json_encode/json_decode 函数与 json 相互转换时,有没有办法在 php 映射中保留数字键?

(我使用的是 PHP 版本 5.2.10-2ubuntu6.4。)

【问题讨论】:

    标签: php map json sparse-array


    【解决方案1】:

    json_decode 默认返回 stdClass 类型的对象。您将成员作为属性访问(即$result->test20)。 10 不是属性的有效名称,这就是您丢失它的原因。

    您可以将true 作为第二个参数传递给json_decode,而不是强制转换为数组,以使其返回关联数组本身:

    $mynewarray = json_decode($json, true);

    如果你这样做,$mynewarray[10] 会正常工作。

    【讨论】:

    • 谢谢克里斯,这正是我所需要的。
    • true 很重要,要在 PHP Array 类型中制作,否则 stdClass Object
    • 天哪,谢谢伙计,这让我大吃一惊。我转储了数组,看到了密钥,但无法通过它访问 val。
    【解决方案2】:

    什么版本的PHP?在 5.2 以下程序/脚本

    $myarray = array(10=>'hi','test20'=>'howdy');
    $json = json_encode($myarray);
    $mynewarray = (array) json_decode($json);
    var_dump($mynewarray);
    

    输出

    array(2) {
      ["10"]=>
      string(2) "hi"
      ["test20"]=>
      string(5) "howdy"
    }
    

    这不会显示您所描述的行为。

    也就是说,如果您的 PHP 版本错误转换了 JSON,请尝试在 json_decode 返回的 stdClass 对象上使用 get_object_vars

    get_object_vars(json_decode($json))
    

    这可能会返回更好的结果。

    【讨论】:

    • 它有 "10" 索引,无法通过 PHP 中的[] 运算符访问
    • 啊,明白了,它将密钥序列化为一个恰好是数字的字符串,这是你无法获取的。 get_object_vars 解决方案应该可以解决这个问题,以及上面提到的 json_decode 的第二个参数。
    【解决方案3】:

    问题在于从对象到数组的转换。

    $a = (array)json_decode('{"10":"hi","test20":"howdy"}');
    var_dump($a);
    
    //outputs
    array(2) {
      ["10"]=>
         string(2) "hi"
      ["test20"]=>
         string(5) "howdy"
    }
    

    看看这个数组如何有索引"10"?但是在 PHP 中,所有看起来像数字的东西都会被转换为数字,尤其是在数组索引中。您不能只获取a["10"],因为它将"10" 转换为数字,而这个数组没有这样的索引。

    但是,foreach 有效。

    foreach ($a as $key => $value) {
       var_dump($key);
       var_dump($value);
    }
    
    //outputs
    string(2) "10"
    string(2) "hi"
    string(6) "test20"
    string(5) "howdy"
    

    您也可以将 json_decode 的结果视为一个对象。虽然你无法做到$a->10$a->"10"

    $a = json_decode('{"10":"hi","test20":"howdy"}');
    $b = 10;
    var_dump($a->$b);
    
    //outputs
    string(2) "hi"
    

    有效。

    但最有可能的是,正如 Chris 所说,您只想传递 true 作为第二个参数。

    $a = json_decode('{"10":"hi","test20":"howdy"}', true);
    var_dump($a[10]);
    
    //outputs
    string(2) "hi"
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 2011-08-25
      • 2018-11-13
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2015-09-20
      • 2017-06-23
      • 2018-08-22
      相关资源
      最近更新 更多