【问题标题】:Problem with json_encode()json_encode() 的问题
【发布时间】:2010-12-03 17:00:25
【问题描述】:

我有一个简单的数组:

array
  0 => string 'Kum' (length=3)
  1 => string 'Kumpel' (length=6)

当我使用 json_encode() 对数组进行编码时,我得到以下信息:

["Kum","Kumpel"] 

我的问题是,得到["Kum","Kumpel"] 而不是{ "0" : "Kum", "1" : "Kumpel" } 的原因是什么?

【问题讨论】:

    标签: php arrays json encode


    【解决方案1】:

    我个人认为这是一个需要在 PHP 中修复的错误。 JSON_FORCE_OBJECT 绝对不是答案。如果您尝试进行任何类型的通用编程,您会经常被绊倒。例如,以下是有效的 PHP:

    array("0" => array(0,1,2,3), "1" => array(4,5,6,7));

    并且应该转换为

    {"0": [0,1,2,3], "1": [4,5,6,7]}

    然而 PHP 希望我要么接受

    [[0,1,2,3],[4,5,6,7]]

    {"0":{"0":1,"1":1,"2":2,"3":3},"1":{"0":4,"1":5 ,"2":6,"3":7}}

    两者都不对。我怎么可能解码这样的对象?有什么可能的原因来改变明显使用字符串作为索引的东西?就像 PHP 试图聪明地帮助那些无法区分字符串和整数的白痴一样,但在此过程中,任何合法使用字符串作为索引的人都搞砸了,不管值可以变成什么。

    【讨论】:

      【解决方案2】:

      只需转换为对象,它就可以正常工作...... JSON_FORCE_OBJECT 参数的作用完全相同。

      json_encode((object)$array);
      

      不要忘记将它转换回 php 数组,以便您可以在 php 中访问它的值:

      $array = (object)$array;
      $array = (array)$array;
      
      json_encode($array);
      

      【讨论】:

        【解决方案3】:

        “{}”括号指定对象,“[]”用于根据 JSON 规范的数组。如果从内存分配的角度来看,数组没有枚举。它只是数据后跟更多数据,另一方面的对象具有带有名称的属性,并且数据被分配给属性,因此要对此类对象进行编码,您还必须传递正确的属性名称。但是对于数组,您不需要指定索引,因为它们总是 0..n,其中 n 是数组的长度 - 1,唯一重要的是数据的顺序。

        $array = array("a","b","c");
        json_encode($array); // ["a","b","c"]
        json_encode($array, JSON_FORCE_OBJECT); // {"0":"a", "1":"b","2":"c"}
        

        JSON_FORCE_OBJECT 强制它使用“0,1,2”的原因是因为要将数据分配给对象,您必须将其分配给属性,因为开发人员没有给出属性名称(仅数据)编码器使用数组索引作为属性名称,因为这些是唯一有意义的名称。

        注意:根据PHP manual,选项参数仅适用于 PHP 5.3。

        对于较旧的 PHP 版本,请参阅 chelmertz 的答案,了解一种使 json_encode 使用索引的方法。

        【讨论】:

        • 不完全是,我收到这个警告:警告:json_encode() 需要 1 个参数,给定 2 个..
        • "5.3.0 添加了 options 参数。"
        • VolkerK,谢谢。自从我上次使用 php 已经有一段时间了,但我想我当时有一些 5.3 的 beta 版本,因为我记得使用过那些选项参数。
        • 这个答案将近 5 年后,this parameter still missing in some translations...
        【解决方案4】:

        正如 Gumbo 所说,在 JS 方面这无关紧要。要强制 PHP 进入它,试试这个:

        $a = new stdClass();
        $a->{0} = "Kum";
        $a->{1} = "Kumpel";
        echo json_encode($a);
        

        不太好用,我会坚持使用数组表示法。

        【讨论】:

        • IHMO:当您需要确保嵌套对象将被序列化为 {...} 而其他嵌套数组将被序列化为 [...] 时,这是正确的方法
        【解决方案5】:

        由于您拥有一个仅包含数字键的 PHP 数组,因此无需使用 JavaScript 对象。但如果你需要,不妨试试 Maiku Mori 的建议。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-09
          • 2011-11-26
          • 1970-01-01
          • 1970-01-01
          • 2017-03-17
          • 2017-08-16
          • 2010-09-25
          • 1970-01-01
          相关资源
          最近更新 更多