JSON替换后大括号缺失问题及dashboard_data表UPDATE语句咨询
解决PostgreSQL中JSON键名替换导致的结构错乱问题
问题根源
你遇到的大括号缺失问题,本质是因为用纯字符串替换(replace())来处理JSON结构化数据——replace()完全不理解JSON的语法规则,它只会盲目匹配并替换子串。如果你的JSON内容存在空格、换行,或者有其他地方意外包含urgent_problem_id子串,就可能破坏JSON的结构(比如错位的大括号、引号不匹配等)。更关键的是,直接操作JSON字符串是不安全的,会埋下格式错误的隐患。
正确解决方案:用PostgreSQL原生JSON函数修改键名
PostgreSQL提供了专门的JSON/JSONB处理函数,能保证修改后JSON结构的完整性。根据你的mr_data字段类型,分两种情况处理:
情况1:字段类型是jsonb(推荐存储JSON的类型)
使用jsonb_delete删除旧键,再用jsonb_set添加新键并赋值:
UPDATE dashboard_data SET mr_data = jsonb_set( mr_data - 'urgent_problem_id', -- 删除旧键 '{urgent_problem_ids}', -- 新键的路径 mr_data -> 'urgent_problem_id' -- 复用旧键的值 ) WHERE mr_data ? 'urgent_problem_id'; -- 仅更新存在该键的行
情况2:字段类型是json
先转成jsonb处理,完成后再转回json:
UPDATE dashboard_data SET mr_data = ( jsonb_set( mr_data::jsonb - 'urgent_problem_id', '{urgent_problem_ids}', mr_data::jsonb -> 'urgent_problem_id' ) )::json WHERE mr_data::jsonb ? 'urgent_problem_id';
预期结果
执行上述语句后,你的数据会得到如下正确修改:
- 第一行:
{"priority_id": "123", "urgent_problem_ids": "111", "important_problem_id": "222"} - 第二行:由于
urgent_problem_id的值是空字符串(而非NULL),不满足原WHERE条件,保持原内容不变:{"priority_id": "456", "urgent_problem_id": "", "important_problem_id": "333"} - 第三行:
{"priority_id": "789", "urgent_problem_ids": "444", "important_problem_id": ""}
额外提示
如果你的mr_data存储的是多个JSON对象拼接的字符串(而非单个合法JSON对象/数组),建议先将其转换为合法的JSON数组,再进行修改,否则任何字符串操作都容易破坏结构。
内容的提问来源于stack exchange,提问作者Pranav Unde




