【问题标题】:Generate json string from multidimensional array data [duplicate]如何使用php生成json? [复制]
【发布时间】:2010-11-28 22:27:55
【问题描述】:

我使用的插件需要以下 JSON 格式的数据:

[
    {oV: 'myfirstvalue', oT: 'myfirsttext'},
    {oV: 'mysecondvalue', oT: 'mysecondtext'}
]

如何使用 PHP 生成上述 JSON 输出?

【问题讨论】:

    标签: php json


    【解决方案1】:

    一旦你有了你的 PHP 数据,你就可以使用json_encode 函数;自 PHP 5.2 起,它与 PHP 捆绑在一起。

    在您的情况下,您的 JSON 字符串表示:

    • 包含 2 个元素的列表
    • 每个都是一个对象,包含 2 个属性/值

    在 PHP 中,这将创建您所代表的结构:

    $data = array(
        (object)array(
            'oV' => 'myfirstvalue',
            'oT' => 'myfirsttext',
        ),
        (object)array(
            'oV' => 'mysecondvalue',
            'oT' => 'mysecondtext',
        ),
    );
    var_dump($data);
    

    var_dump 让您:

    array
      0 => 
        object(stdClass)[1]
          public 'oV' => string 'myfirstvalue' (length=12)
          public 'oT' => string 'myfirsttext' (length=11)
      1 => 
        object(stdClass)[2]
          public 'oV' => string 'mysecondvalue' (length=13)
          public 'oT' => string 'mysecondtext' (length=12)
    

    并且,将其编码为 JSON:

    $json = json_encode($data);
    echo $json;
    

    你得到:

    [{"oV":"myfirstvalue","oT":"myfirsttext"},{"oV":"mysecondvalue","oT":"mysecondtext"}]
    

    顺便说一句,据我记得,我会说您的 JSON 字符串不是有效的 JSON 数据:字符串周围应该有双引号,包括对象属性的名称。

    语法见http://www.json.org/

    【讨论】:

    • 您实际上不需要将数组转换为对象。如果您有字符串键,json_encode 会自动认为它应该将事物表示为对象。
    • 嗨,我从上面的代码得到的输出实际上是不同的:array(2) { [0]=> object(stdClass)#1 (2) { ["oV"]=> string (12) "myfirstvalue" ["oT"]=> string(11) "myfirsttext" } [1]=> object(stdClass)#2 (2) { ["oV"]=> string(13) "mysecondvalue" ["oT"]=> 字符串(12) "mysecondtext" } } [{"oV":"myfirstvalue","oT":"myfirsttext"},{"oV":"mysecondvalue","oT":"mysecondtext "}]
    • 我把上面代码中的var_dump去掉了,主要部分修改如下。现在它工作正常: $data = array( array( oV => 'myfirstvalue', oT => 'myfirsttext', ), array( oV => 'mysecondvalue', oT => 'mysecondtext', ), );跨度>
    • 哦,是的,我使用的是xdebug.org 扩展名,所以我的var_dump 与默认的有点不同(更好的html 格式输出;即更容易调试);;关于对象的转换:没有必要,但我喜欢拥有它们,以便在 PHP 端获取对象,而不仅仅是在 JSON/javascript 端(我觉得两边都接近的数据类型更好)
    【解决方案2】:

    最简单的方法可能是从您想要的对的关联数组开始:

    $data = array("myfirstvalue" => "myfirsttext", "mysecondvalue" => "mysecondtext");
    

    然后使用 foreach 和一些字符串连接:

    $jsontext = "[";
    foreach($data as $key => $value) {
        $jsontext .= "{oV: '".addslashes($key)."', oT: '".addslashes($value)."'},";
    }
    $jsontext = substr_replace($jsontext, '', -1); // to get rid of extra comma
    $jsontext .= "]";
    

    或者,如果您有最新版本的 PHP,您可以使用内置的 json 编码函数 - 只需注意传递给它们的数据以使其与预期格式匹配。

    【讨论】:

    • 这很有魅力,谢谢。虽然如果我理解正确我应该使用“json_encode”会更好的编码?
    • @TimWachter 这个答案来自 2009 年;请注意最后关于“如果您有最新版本”的内容;相当多的主机仍然只运行 PHP 4(json_encode 是在 5.2 中引入的)。
    • 我最近写了一个 PHP JSON Builder,它允许以编程方式构建 JSON:github.com/borisguery/json-builder
    【解决方案3】:

    您可以使用 stdClass,添加属性和 json_encode 对象。

    $object = new stdClass();
    $object->first_property = 1;
    $object->second_property = 2;
    
    echo '<pre>';var_dump( json_encode($object) , $object );die;
    

    瞧!

    string(40) "{"first_property":1,"second_property":2}"
    object(stdClass)#43 (2) {
      ["first_property"]=>
      int(1)
      ["second_property"]=>
      int(2)
    }
    

    【讨论】:

    • 输入的数据类型是数组还是对象无关紧要 -- json_encode() 将生成完全相同的字符串。
    【解决方案4】:

    这是php开发中最基本的规则之一:

    不要手动构建 JSON 字符串。 使用json_decode()

    如果您需要循环填充数据,请先收集所有数据,然后调用json_encode()只需一次

    不要尝试将其他数据包装/前置/附加到编码的 json 字符串。如果要向 json 有效负载添加数据,则对其进行解码,添加数据,然后对其重新编码。

    如果你将对象类型或数组类型的数据传递给json_encode() 没有区别——默认情况下,它仍然会使用方括号为索引数组创建一个字符串,为具有非索引键的可迭代数据创建一个花括号。

    代码:

    $array = [
        [
            'oV' => 'myfirstvalue',
            'oT' => 'myfirsttext'
        ],
        [
            'oV' => 'mysecondvalue',
            'oT' => 'mysecondtext'
        ]
    ];
    
    echo json_encode($array);
    

    输出:

    [{"oV":"myfirstvalue","oT":"myfirsttext"},{"oV":"mysecondvalue","oT":"mysecondtext"}]
    

    为了清楚起见,我应该表示 OP 所需的输出不是有效的 json,因为嵌套的键没有被双引号包裹。

    【讨论】:

      【解决方案5】:

      这是生成json格式的php代码。

      while ($row=mysqli_fetch_assoc($result))
      {
          $array[] = $row;
      }
      echo '{"ProductsData":'.json_encode($array).'}'; //Here ProductsData is just a simple String u can write anything instead
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-24
        • 2014-01-10
        • 2011-01-28
        • 1970-01-01
        • 2015-06-08
        • 2017-03-22
        • 1970-01-01
        • 2018-01-30
        相关资源
        最近更新 更多