代码之家  ›  专栏  ›  技术社区  ›  cupakob

json_encode()有问题

  •  8
  • cupakob  · 技术社区  · 15 年前

    我有一个简单的数组:

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

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

    ["Kum","Kumpel"] 
    

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

    5 回复  |  直到 8 年前
        1
  •  22
  •   Maiku Mori    15 年前

    “”括号指定一个对象,根据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强制对象使用“0,1,2”的原因是,要将数据分配给对象,必须将其分配给属性,因为开发人员没有提供属性名(只有数据),编码器使用数组索引作为属性名,因为这些是唯一有意义的名称。

    注:根据 PHP manual 选项参数仅在php 5.3中可用。

    对于较旧的PHP版本,请参考Chelmertz的答案,以获得让json_编码以使用索引的方法。

        2
  •  7
  •   chelmertz user1604064    15 年前

    正如甘博所说,在JS方面,这无关紧要。要强制使用PHP,请尝试以下操作:

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

    没那么有用,我还是用数组表示法。

        3
  •  2
  •   TaylorMac    12 年前

    只需将其转换为一个对象,它就会很好地工作……json_force_对象参数的作用完全相同。

    json_encode((object)$array);
    

    不要忘记将其转换回PHP数组,这样您就可以在PHP中访问其值:

    $array = (object)$array;
    $array = (array)$array;
    
    json_encode($array);
    
        4
  •  0
  •   Gumbo    15 年前

    因为您有一个只包含数字键的PHP数组,所以不需要使用javascript对象。但是如果你需要一个,尝试一下maiku mori_墠的建议。

        5
  •  0
  •   Chris Nasr    8 年前

    我个人认为这是一个需要在PHP中修复的bug。json_force_对象绝对不是答案。如果你尝试做任何类型的通用编程,你会经常被绊倒。例如,以下是有效的php:

    数组(“0”=>数组(0,1,2,3),“1”=>数组(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试图聪明地帮助那些不能区分字符串和in t的白痴,但是在这个过程中,任何人都会把字符串合法地用作索引,不管它的值会变成什么。