Mysql插入JSON串会被去一层转义

在MySQL中存储JSON字符串时遇到了转义问题,导致程序解析失败。问题出现在JSON字符串字段内包含已转义的字符串。解决方法包括在插入前手动再进行一次转义,或者使用数据库工具(如Navicat)生成已转义的INSERT语句。这两种方法都能确保JSON数据正确存储并避免线上问题。
摘要由CSDN通过智能技术生成

Mysql插入JSON串会被去一层转义

问题描述

背景:在数据库更新、新增一个字段为JSON串的时候,被去一层转义,导致程序解析失败,报错

原JSON串

[
    {
        "rules": [
            {
                "ruleType": 1,
                "value": "1458",
                "rate": 90
            },
            {
                "ruleType": 3,
                "value": "{\"begin\":\"测试欢迎语\",\"end\":\"测试结束语\",\"template\":[\"6962def-sadfa\"],\"title\":\"标题\"}",
                "rate": 10
            }
        ],
        "tag": 1,
        "sort": 2,
        "ruleName": "分流默认路由"
    },
    {
        "rules": [
            {
                "ruleType": 1,
                "value": "1533",
                "rate": ""
            }
        ],
        "labelCode": "red_user",
        "sort": 1,
        "tag": 2,
        "ruleName": "标签路由"
    }
]

先对JSON压缩

[{"rules": [{"ruleType": 1,"value": "1458","rate": 90},{"ruleType": 3,"value": "{\"begin\":\"测试欢迎语\",\"end\":\"测试结束语\",\"template\":[\"6962def-sadfa\"],\"title\":\"标题\"}","rate": 10}],"tag": 1,"sort": 2,"ruleName": "分流默认路由"},{"rules": [{"ruleType": 1,"value": "1533","rate": ""}],"labelCode": "red_user","sort": 1,"tag": 2,"ruleName": "标签路由"}]

然后就直接

update `shuidi_cs_biz`.`session_sub_route_rule` set rules = '[{"rules": [{"ruleType": 1,"value": "1458","rate": 90},{"ruleType": 3,"value": "{\"begin\":\"测试欢迎语\",\"end\":\"测试结束语\",\"template\":[\"6962def-sadfa\"],\"title\":\"标题\"}","rate": 10}],"tag": 1,"sort": 2,"ruleName": "分流默认路由"},{"rules": [{"ruleType": 1,"value": "1533","rate": ""}],"labelCode": "red_user","sort": 1,"tag": 2,"ruleName": "标签路由"}]' where id = 1;

update 或者 insert 都行, 然后查下更新后的

[
{
    "rules": [
    {
        "ruleType": 1,
        "value": "1458",
        "rate": 90
    },
    {
      //注意这部分,解析出现问题了
        "ruleType": 3,
        "value": "{"
        begin ":"
        测试欢迎语 ","
        end ":"
        测试结束语 ","
        template ":["
        6962 def - sadfa "],"
        title ":"
        标题 "}",
        "rate": 10
    }],
    "tag": 1,
    "sort": 2,
    "ruleName": "分流默认路由"
},
{
    "rules": [
    {
        "ruleType": 1,
        "value": "1533",
        "rate": ""
    }],
    "labelCode": "red_user",
    "sort": 1,
    "tag": 2,
    "ruleName": "标签路由"
}]

然后GG了,线上出问题了。

注意

这种问题出现在**,JSON字符串字段,包含一个转义字符串的情况**,如图

image-20220415110757838

这里,

解决的办法

第一种: 在压缩字符串后,进行一次转义

[{\"rules\": [{\"ruleType\": 1,\"value\": \"1458\",\"rate\": 90},{\"ruleType\": 3,\"value\": \"{\\\"begin\\\":\\\"测试欢迎语\\\",\\\"end\\\":\\\"测试结束语\\\",\\\"template\\\":[\\\"6962def-sadfa\\\"],\\\"title\\\":\\\"标题\\\"}\",\"rate\": 10}],\"tag\": 1,\"sort\": 2,\"ruleName\": \"分流默认路由\"},{\"rules\": [{\"ruleType\": 1,\"value\": \"1533\",\"rate\": \"\"}],\"labelCode\": \"red_user\",\"sort\": 1,\"tag\": 2,\"ruleName\": \"标签路由\"}]

然后新增,修改就都可以

第二种

有第一种,必然有第二种,哈哈哈

1、我用的navicat,直接在工具上,copy as insert statement

image-20220415111120449

2、 然后发现,人家的格式就是转义后的,参考这个维护就行

insert into `shuidi_cs_biz`.`session_sub_route_rule` ( `sub_route_name`, `channel_id`, `rules`, `status`, `is_delete`, `create_time`, `update_time`) values ( '路由', '7', '[{\"rules\": [{\"ruleType\": 1,\"value\": \"1458\",\"rate\": 90},{\"ruleType\": 3,\"value\": \"{\"begin\":\"测试欢迎语\",\"end\":\"测试结束语\",\"template\":[\"6962def-sadfa\"],\"title\":\"标题\"}\",\"rate\": 10}],\"tag\": 1,\"sort\": 2,\"ruleName\": \"分流默认路由\"},{\"rules\": [{\"ruleType\": 1,\"value\": \"1533\",\"rate\": \"\"}],\"labelCode\": \"red_user\",\"sort\": 1,\"tag\": 2,\"ruleName\": \"标签路由\"}]', '1', '1', '2021-07-26 10:25:02', '2022-04-15 11:05:46');

这个问题采坑线上两次了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值