请求协助:将指定SQL查询结果转换为特定嵌套结构的JSON输出
把SQL查询结果转换成指定JSON结构的方案
嘿,我来帮你搞定这个需求!首先先提个小细节:你给出的SQL语句里有个语法错误——p.regionCity,,issuer_type这里多了一个逗号,得去掉才能正常执行哦。
接下来,根据不同的场景,我给你两种常见的实现方式:
1. 直接在SQL层生成目标JSON
如果你的数据库支持JSON函数(比如MySQL 5.7+、PostgreSQL 9.4+),可以直接用内置函数生成你要的结构,不用在应用层额外处理。
MySQL 版本
SELECT JSON_OBJECT( 'issuer', JSON_OBJECT( 'address', JSON_ARRAYAGG( JSON_OBJECT( 'branchID', p.branchID, 'country', country, 'governate', p.governate, 'regionCity', p.regionCity ) ), 'id', issuer_id, 'name', issuer_name, 'type', issuer_type ) ) AS formatted_result FROM issuer GROUP BY issuer_id, issuer_name, issuer_type;
说明:
JSON_ARRAYAGG会把同一个发行方(issuer)下的所有分支机构地址聚合成一个数组,对应address字段GROUP BY是为了确保每个发行方只生成一个JSON对象,避免重复- 最终结果会输出一个名为
formatted_result的字段,内容就是你要的JSON结构
PostgreSQL 版本
PostgreSQL的JSON函数命名略有不同,写法如下:
SELECT json_build_object( 'issuer', json_build_object( 'address', json_agg( json_build_object( 'branchID', p.branchID, 'country', country, 'governate', p.governate, 'regionCity', p.regionCity ) ), 'id', issuer_id, 'name', issuer_name, 'type', issuer_type ) ) AS formatted_result FROM issuer GROUP BY issuer_id, issuer_name, issuer_type;
2. 在应用层处理(以Python为例)
如果你的数据库不支持JSON函数,或者你更倾向于在应用层控制转换逻辑,可以用代码来处理查询结果。这里以Python+pandas为例:
import pandas as pd import json import psycopg2 # 或者用pymysql,根据你的数据库选择 # 1. 连接数据库并执行查询(这里以PostgreSQL为例) conn = psycopg2.connect( dbname="你的数据库名", user="用户名", password="密码", host="主机地址" ) # 注意修正SQL里的逗号错误 query = """ select p.branchID,country,p.governate,p.regionCity,issuer_type,issuer_id,issuer_name from issuer """ df = pd.read_sql(query, conn) conn.close() # 2. 按发行方分组,构造地址数组 grouped_data = df.groupby(['issuer_id', 'issuer_name', 'issuer_type']).apply( lambda group: group[['branchID', 'country', 'governate', 'regionCity']].to_dict('records') ).reset_index(name='address') # 3. 生成目标JSON结构 final_json = grouped_data.apply( lambda row: { "issuer": { "address": row['address'], "id": str(row['issuer_id']), # 如果需要字符串类型,转一下 "name": row['issuer_name'], "type": row['issuer_type'] } }, axis=1 ).tolist() # 4. 输出格式化后的JSON print(json.dumps(final_json, indent=2, ensure_ascii=False))
说明:
- 代码先把查询结果读入DataFrame,然后按发行方的唯一标识分组
- 把每个分组里的地址字段转成字典列表,对应
address数组 - 最后嵌套成你要的JSON结构,输出时可以用
indent参数让格式更美观
内容的提问来源于stack exchange,提问作者Omar Mohsen
相关产品推荐
相关产品推荐

