一次python json loads转义字符报错问题
上面的这个结构,我们看到由于要在双引号中,继续使用双引号所以使用转义字符,但其实只需要一个转义字符就可以了,上面输入了两个,多了一个转义字符在解析时候会导致报错。
·
背景介绍
最近折腾数据,遇见一个的python json load 字符串 json 格式的数据报错问题,如下格式:
{"command": "job_id=$(echo \\"${APP_NAME}\\""}
上面的这个结构,我们看到由于要在双引号中,继续使用双引号所以使用转义字符,但其实只需要一个转义字符就可以了,上面输入了两个,多了一个转义字符在解析时候会导致报错
异常复现
import json
line = '{"command":"job_id=$(echo \\\\\"${APP_NAME}\\\\\""}' # 注意这个转义
obj = json.loads(line)
注意, 如果不是从文件里面读取成变量,则需要再次进行转义,因为 python字面量 默认会自动把多余的 \ 去掉
v1 = '{"command":"job_id=$(echo \\"${APP_NAME}\\""}' # 字面量,会自动去掉多余的 \
v2 = '{"command":"job_id=$(echo \\\\\"${APP_NAME}\\\\\""}' # 需要多次转义保证输入值是正确的
print(v1)
print(v2)
# 输出
{"command":"job_id=$(echo \"${APP_NAME}\""}
{"command":"job_id=$(echo \\"${APP_NAME}\\""}
异常:
File "/Users/test/conda/miniconda3/envs/py36/lib/python3.6/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 30 (char 29)
修复报错
对这种模式下多余的转义字符去掉即可
before_replace_char = "\\\\\"" # \\"
after_replace_char = "\\\"" # \"
line = '{"command": "job_id=$(echo \\"${APP_NAME}\\""}'
print(line.replace(before_replace_char, after_replace_char))
本质原因
上面的方法修复了这个问题,后面又仔细排查了一下,发现是使用 mysql SQL脚本 导出数据的时候,默认会增加转义字符,需要加上 -r (raw) 之后,才不会自动添加转义字符,附上导出命令:
mysql -h192.168.1.12 -uroot -ptest -Dtest -N -B -s -r -e "select * from server"
参数解释:
-N:跳过header的列信息
-B:批量模式导出
-s:静默模式
-e: 使用命令行sql执行
-r: (raw) 禁止转义 比如对: \"${APP_NAME}\" 自动转义成 \\"${APP_NAME}\\"

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)