C#结合SQL Server实现翻译表按Key分组输出指定结构JSON的方法
翻译数据行转嵌套JSON的极简实现方案
下面提供两类无需复杂嵌套循环的实现思路,按需选择即可:
方案1:数据库层面直接生成(最省心,无需后端额外处理)
直接修改SQL查询语句,利用数据库自带的JSON聚合能力直接返回目标结构的JSON,不需要后端代码做二次转换:
PostgreSQL 实现
SELECT json_object_agg("Key", lang_map) AS result FROM ( SELECT "Key", json_object_agg("CultureId", "Txt") AS lang_map FROM "Xlations" GROUP BY "Key" ) t;
MySQL 实现(MySQL 5.7及以上版本支持)
SELECT JSON_OBJECTAGG(`Key`, lang_map) AS result FROM ( SELECT `Key`, JSON_OBJECTAGG(`CultureId`, `Txt`) AS lang_map FROM `Xlations` GROUP BY `Key` ) t;
执行上述查询后,直接取出result字段的值返回给前端即可,完全不需要额外处理。
方案2:后端代码层面极简实现
如果不想修改SQL,用后端语言自带的高阶函数或工具类就能几行搞定,不需要嵌套循环:
JavaScript/Node.js 实现
假设SQL查询返回的行数据存在rows数组中,一行代码即可完成转换:
const result = rows.reduce((acc, { Key, CultureId, Txt }) => { acc[Key] = acc[Key] || {} acc[Key][CultureId] = Txt return acc }, {})
简写版本:
const result = rows.reduce((acc, cur) => ((acc[cur.Key]??={})[cur.CultureId] = cur.Txt, acc), {})
Python 实现
from collections import defaultdict # rows为SQL查询返回的字典格式行列表 result = defaultdict(dict) for row in rows: result[row['Key']][row['CultureId']] = row['Txt'] # 如需转成普通字典直接使用dict(result)即可
注意事项
- 你给出的目标JSON示例中
$WELCOME的两种语言翻译和原始表数据不一致,属于笔误,实际处理时以数据库查询返回的Txt字段值为准即可 - 如果存在重复
Key+CultureId的记录,后处理的记录会自动覆盖之前的记录,可根据业务需求提前加去重或排序逻辑
内容的提问来源于stack exchange,提问作者Marco Jr
相关产品推荐
相关产品推荐

