一次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}\\"

你可能感兴趣的:(python,python,json,开发语言)