将表转换为带有长文本列的 JSON 数组

Posted

技术标签:

【中文标题】将表转换为带有长文本列的 JSON 数组【英文标题】:Convert table to JSON array with longtext column 【发布时间】:2021-03-17 11:09:53 【问题描述】:

我正在使用 mariaDB 10.3,我有一个表:

CREATE TABLE user(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, parameters longtext,  PRIMARY KEY(id));

有行:

INSERT INTO user VALUES (1, 'name1', '"number": 1, "text": "some text"'), (2, 'name2', '"number": 2, "text": "some more text"');

我正在尝试编写将表返回为JSON 对象的查询。 到目前为止我有

SELECT CONCAT(
    '[',
      GROUP_CONCAT(JSON_OBJECT('id',id,'name',name,'parameters', parameters)),
    ']'
 ) 
FROM user;

但这会返回:

[
  "id": 1,
    "name": "name1",
    "parameters": "\"number\": 1, \"text\": \"some text\""
  ,
  
    "id": 2,
    "name": "name2",
    "parameters": "\"number\": 2, \"text\": \"some more text\""
  
]

这不是正确的 JSON。我应该更改什么才能正确格式化parameters

我想得到的是:

[
  
    "id": 1,
    "name": "name1",
    "parameters": 
      "number": 1,
      "text": "some text"
    
  ,
  
    "id": 2,
    "name": "name2",
    "parameters": 
      "number": 2,
      "text": "some more text"
    
  
]

谢谢

【问题讨论】:

(1) 如果您只有 1 行,您希望 GROUP_CONCAT 完成什么? (2) 请在您的问题中添加所需的结果。 (使用Edit)。 你是对的,为简单起见,我只展示了 1 行,但要使这个问题有意义,最少 2 行。我还添加了想要的结果。 好的。我是否正确理解转义括号 (\") 是唯一将您与成功区分开来的东西?还是我错过了什么? 并在参数条目的开头和末尾附加引号(“)。 【参考方案1】:

JSON_COMPACT 函数是 MariaDB 特有的,在 mysql 中不存在,可以应用于 parameters

SELECT CONCAT(
       '[',
        GROUP_CONCAT(JSON_OBJECT('id',id,
                                 'name',name,'parameters', 
                                  JSON_COMPACT(parameters))),
       ']'
       ) AS "JSON Value"
  FROM user

Demo

【讨论】:

谢谢,这正是我所需要的。 不客气@friltase,也欢迎为SO投稿。

以上是关于将表转换为带有长文本列的 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

使用带有过滤器和其他列的 pyspark 将 CSV 转换为 JSON [关闭]

将 NumPy 数组转换为带有列的 Pandas 数据框

将 NumPy 数组转换为带有列的 Pandas 数据框

带有 JSON 数据的 jqGrid 将表呈现为空

将 Json 转换为 XML - 带有数组值的 Json

如何验证集合的类型?