将 SQL 结果转换为 JSON 的正确方法

Posted

技术标签:

【中文标题】将 SQL 结果转换为 JSON 的正确方法【英文标题】:Proper way to convert SQL results to JSON 【发布时间】:2018-05-09 16:26:05 【问题描述】:

我正在使用 nodejs 创建一个 API。 API 接受请求并以 JSON 格式响应

例如: 我的数据库中有一个表 QUESTION,因此对端点 http://localhost/table/question 的 GET 请求将以 JSON 格式输出该表。

但是在执行JOINS的时候有问题

考虑表 QUESTION 和 CHOICE。一个问题有很多选择(答案),他们的加入将是

表:

我正在尝试转换成这样的东西

  
   "0":  
      "QUESTION":"If Size of integer pointer is 4 Bytes what is size of float pointer ?",
      "OPTION":  
         "A":"3 Bytes",
         "B":"32 Bits",
         "C":"64 Bits",
         "D":"12 Bytes"
      
   ,
   "1":  
      "QUESTION":"Which one is not a SFR",
      "OPTION":  
         "A":"PC",
         "B":"R1",
         "C":"SBUF"
      
   ,
   "2":  
      "QUESTION":"What is Size of DPTR in 8051",
      "OPTION":  
         "A":"16 Bits",
         "B":"8 Bytes",
         "C":"8 Bits"
      
   ,
   "3":  
      "QUESTION":"Is to_string() is valid builtin function prior to c++11 ? ",
      "OPTION":  
         "A":"Yes",
         "B":"No"
      
   

显而易见的解决方案是使用 JOIN 解析查询并将其转换为 JSON。 有没有更有效的方法?

【问题讨论】:

您是否可以访问 php?它有一个很好的 json_encode 函数。很容易从 php 连接到 mysql 您的 JSON 对我来说似乎不是最理想的。数字键是*** id 还是索引?在后一种情况下,将其替换为数组,它会更有意义。至于处理本身,只需遍历结果并在找到新问题时创建一个新对象,或者如果问题已经存在则添加到 OPTIONS(即它与您看到或添加的最后一个相同)。你可以使用一个简单的循环,或者使用reduce 来做到这一点。一个你有你的数据只是JSON.stringify它(或者如果使用Express,则用res.json输出它)。 注意:如果问题涉及 PostgreSQL 而不是 MySQL,您可以轻松地在 SQL 中使用数组和聚合函数完成所有这些操作。 【参考方案1】:

在 MySQL 中,您可以使用 group_concat 实现此目的

表名、字段名等纯属幻想 :-)

select
    q.text as question,
    group_concat(answer.label, ';;;') as labels,
    group_concat(answer.text, ';;;') as answers
from
    question as q
    join answer as a on a.quesion = q.id
group by
    q.text

然后在你的应用程序(nodejs)中

let resultRows = callSomeFunctionsThatReturnesAllRowsAsArray();
let properStructure = resultRows.map(row => 
    let texts = row.answers.split(';;;');
    return 
        question: row.question,
        options: row.labels.split(';;;').map((label, index) => label: label, answer: texts[index]);
    
);

【讨论】:

非常有用,使用group_concat(answer.label, ';;;') 的一项改进在javascript 中拆分时在最后一个位置生成空值,但是使用group_concat(answer.label SEPARATOR ';;;') 很容易解决

以上是关于将 SQL 结果转换为 JSON 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NodeJs 响应转换为嵌套的 json 响应

有没有办法让 PHP 将 sql 结果直接转换为 JSON?

通过 PHP 将 Sql 数据库转换为具有正确格式的 JSON,并在 PHP 脚本本身中对值进行排序

将json数据(未定义/混乱)转换为DataFrame的正确方法是啥?

将json结果转换为日期[重复]

将json调用语法从Objective-C转换为Swift的正确方法是啥?