【问题标题】:Create multi-level JSON with PHP and MySQL使用 PHP 和 MySQL 创建多级 JSON
【发布时间】:2018-06-08 08:55:18
【问题描述】:

我不知道如何使用 PHP 和 MySQL 创建多级 JSON 输出。

我有这个查询(这个问题的简化)

$query = "SELECT 
           1 as id, 
           JSON_OBJECT('key1', 1, 'key2', 'abc') as json1";

我把它变成了一个数组

while ($row = mysqli_fetch_assoc($result)) {
        $resultArray[] = $row;
}
return $resultArray;

然后使用json_encode:

echo json_encode($result);

这让我感动

[
    {
        id: "1",
        json1: "{"key1": 1, "key2": "abc"}"
    }
]

即,变量作为字符串返回。

我想要实现的是将变量 json_test 作为 JSON 的第二级,如下所示:

[
    {
        id: "1",
        json1: 
                  {
                       key1: 1, 
                       key2: "abc"
                  }
    }
]

我在这个网站上尝试了以下提示,但没有任何乐趣:

JSON_ARRAY(GROUP_CONCAT(JSON_OBJECT('key1', 1, 'key2', 'abc'))) AS json2

给我

json2: "["{\"key1\": 1, \"key2\": \"abc\"}"]",

CAST(CONCAT('[',GROUP_CONCAT(JSON_OBJECT('key1', 1, 'key2', 'abc')),']') AS JSON) AS json3

给我

json3: "[{"key1": 1, "key2": "abc"}]"

非常感谢任何提示。

我使用的是 PHP 7.0.25 和 MySQL 5.7.20。

【问题讨论】:

    标签: php mysql arrays json


    【解决方案1】:

    JSON_OBJECT 作为字符串返回给 PHP(正如 prodigitalson 注释的那样)

    您希望将所有数据作为关联数组。

    为此,在您发布的示例中,json1 必须通过 json_decode 传递。

    while ($row = mysqli_fetch_assoc($result)) {
            $row['json1'] = json_decode( $row['json1'], true ); // <----
            $resultArray[] = $row;
    }
    return $resultArray;
    

    现在你应该得到想要的结果:

    echo json_encode($resultArray);
    

    【讨论】:

    • 太棒了,你是明星。非常感谢!
    【解决方案2】:

    使用 MySQL 构建所需的结构可以这样完成:

    mysql> SELECT JSON_OBJECT('id', 1, 'json1', JSON_OBJECT('key1', 1, 'key2', 'abc')) AS obj;
    +------------------------------------------------+
    | obj                                            |
    +------------------------------------------------+
    | {"id": 1, "json1": {"key1": 1, "key2": "abc"}} |
    +------------------------------------------------+
    1 row in set (0.00 sec)
    

    在 PHP 中,我们可以从 JSON 转到数组:

    php > var_dump(json_decode('{"id":1,"json1":{"key1":1,"key2":"abc"}}', TRUE));
    array(2) {
      ["id"]=>
      int(1)
      ["json1"]=>
      array(2) {
        ["key1"]=>
        int(1)
        ["key2"]=>
        string(3) "abc"
      }
    }
    

    或数组转 JSON:

    php > $tmp = ['id' => 1, 'json1' => ['key1' => 1, 'key2' => 'abc']];
    php > var_dump($tmp);
    array(2) {
      ["id"]=>
      int(1)
      ["json1"]=>
      array(2) {
        ["key1"]=>
        int(1)
        ["key2"]=>
        string(3) "abc"
      }
    }
    php > print(json_encode($tmp));
    {"id":1,"json1":{"key1":1,"key2":"abc"}}
    

    【讨论】:

    • 感谢您的回答!不幸的是,您的建议似乎不起作用 - 这就是我得到的: [ { obj: "{"id": 1, "json1": {"key1": 1, "key2": "abc"}}" } ]
    • 如你所见,我直接从命令行 PHP 和 MySQL 复制粘贴。您还有哪些尚未满足的需求?
    • 你在跑什么,想要的结果是什么?
    • 您当前正在将对象作为字符串放入。如果你使用 json_decode 把它变成一个对象,那么你可以把它作为一个 key 放入并重新编码整个东西。如果您提供您的代码,我可以向您展示它的外观
    • mysqli 不会将JSON_OBJECT 转换为 php 数组或 stdObject。如果你想重新编码输出,你需要在你的循环中调用json_decode
    猜你喜欢
    • 2018-09-20
    • 2019-01-10
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2018-09-05
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多