【问题标题】:Backslash in json_encode (PHP) + JSON_ARRAYAGG (mySQL)json_encode (PHP) + JSON_ARRAYAGG (mySQL) 中的反斜杠
【发布时间】:2020-03-12 12:35:51
【问题描述】:

问题是数组颜色中带引号的反斜杠。我认为这是因为 JSON_ARRAYAGG 但我不知道如何打印正确的 json。

查询:

SELECT a.id_product, JSON_ARRAYAGG(c.name_color) as colors, a.url 
FROM products as a 
LEFT JOIN product_has_colors b ON a.id_product = b.id_product 
LEFT JOIN colors c ON c.id_color = b.id_color 
GROUP BY a.id_product;

+------------+-------------------+-----------------+
| id_product | colors            | url             |
|------------+-------------------+-----------------+
|     1      | ["yellow", "blue"]| https://url.com |
|     2      | ["black, "green"] | https://url.com |
+------------+-------------------+-----------------+

PHP:

header('Content-Type: application/json);
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);

输出:

[
  {
    "id_product: "1",
    "colors": [\"yellow\", \"blue\"]",
    "url": "https://url.com"
  },
 {
    "id_product: "2",
    "colors": [\"black\", \"green\"]",
    "url": "https://url.com"
  }
]

【问题讨论】:

  • 您的“输出”不是有效的 JSON 字符串。你是手写的吗?

标签: php mysql json mysql-json


【解决方案1】:

您正在对colors 进行两次编码。首先是 SQL,然后是 PHP。您可以做的是在 PHP 编码$data之前解码colors

foreach ($data as $key = $row) {
    $data[$key]['colors'] = json_decode($row['colors']);
}

如果你作为对象获取,那么使用这个:

foreach ($data as $obj) {
    $obj->colors = json_decode($obj->colors);
}

或者完全用 SQL 生成 JSON:

SELECT JSON_ARRAYAGG(JSON_OBJECT(
    'id_product', id_product,
    'colors', colors,
    'url', url
)) as json
FROM (
    SELECT a.id_product, JSON_ARRAYAGG(c.name_color) as colors, a.url 
    FROM products as a 
    LEFT JOIN product_has_colors b ON a.id_product = b.id_product 
    LEFT JOIN colors c ON c.id_color = b.id_color 
    GROUP BY a.id_product
) x

【讨论】:

    【解决方案2】:

    我在 MYSQL 和 PHP 上使用 JSON_ARRAYAGG 我使用这个函数来删除反斜杠:

    function isJson($string) {
            json_decode($string, true);
            return (json_last_error() == JSON_ERROR_NONE);
        }
        
        
        function result_as_json($result, $array_columns = null){
            $json = array();
            foreach($result as $res) {
                $item = array();
                if($array_columns != null){
                    foreach ( $array_columns as $key) {
                        $item[$key] = isJson($res[$key])?json_decode($res[$key], true):$res[$key];
                    }
                }
                else {
                    foreach ($res as $key => $value) {
                        $item[$key] = isJson($value)?json_decode($value, true):$value;
                    }
                }
                array_push($json, $item);
            }
            return json_encode($json);
        }
    

    希望对你有帮助:D

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 2011-07-13
      • 1970-01-01
      • 2012-05-06
      • 2021-11-21
      • 2017-11-30
      • 1970-01-01
      • 2016-09-20
      • 2016-06-16
      相关资源
      最近更新 更多