MySQL使用JSON_ARRAY_APPEND添加JSON对象异常问题求助
解决MySQL中JSON对象添加新键值对的问题
你的问题核心是选错了JSON操作函数——JSON_ARRAY_APPEND是用来给数组追加元素的,但你的原始数据是一个JSON对象,并非数组;再加上你把新的JSON结构当成普通字符串传入,自然就出现了数组包裹和多余转义符的问题。下面给你两种靠谱的解决方案:
方法1:用JSON_MERGE_PRESERVE直接合并JSON对象
这个函数可以无缝合并两个JSON对象,保留原有键的同时添加新的键值对,语法简单直观:
UPDATE calculation SET payment = JSON_MERGE_PRESERVE(payment, '{"2018": {"1": {"payed": 0,"charge": 0}}}');
执行后会直接把原有payment字段的JSON对象和你传入的新JSON对象合并,得到你期望的结果。
方法2:用JSON_SET精准插入新键
如果想要更精准地控制键的路径,推荐用JSON_SET搭配JSON_OBJECT构建嵌套JSON(避免手动写字符串可能出现的格式错误):
UPDATE calculation SET payment = JSON_SET( payment, '$.2018', JSON_OBJECT( '1', JSON_OBJECT('payed', 0, 'charge', 0) ) );
这里'$.2018'是新键的路径,JSON_OBJECT会帮你生成规范的嵌套JSON结构,完全不需要担心转义符的问题,MySQL会自动处理成正确的格式。
为什么原来的方法会出错?
JSON_ARRAY_APPEND的定位是数组操作:如果目标不是数组,它会先把目标包裹成数组的第一个元素,再追加你传入的内容,这就是你看到[{"2017": ...}]数组结构的原因。- 你传入的新JSON是字符串形式,MySQL会把它当作普通字符串值存入数组,因此会自动转义双引号,导致出现
\"这类多余的转义符。
内容的提问来源于stack exchange,提问作者Igor Petev
相关产品推荐
相关产品推荐

