将 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 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法让 PHP 将 sql 结果直接转换为 JSON?
通过 PHP 将 Sql 数据库转换为具有正确格式的 JSON,并在 PHP 脚本本身中对值进行排序