如何在Python中从环境变量获取无多余转义的原始JSON字符串?
问题
在Bash中,我通过jq将JSON存入环境变量:
export FOO=$(curl ... | jq -Rs)
在Python中读取该变量:
import os bar = os.environ["FOO"]
此时bar的内容类似{\\"this\\":\\"that\\"},使用json.loads(bar)会报错。尝试过repr、rf'{os.environ["FOO"]}'等方法,但找不到合适的内置方式去除多余斜杠,又不想直接替换斜杠,避免后续维护出现问题。
解决方案
从根源解决:修正Bash端命令
问题出在jq -Rs的参数上:-Rs会把输入内容作为单行字符串进行转义,导致JSON被当成普通字符串处理,存入环境变量时多了一层不必要的转义。
改用jq -c参数(将JSON压缩为单行),直接输出原始JSON结构:
export FOO=$(curl ... | jq -c)
之后在Python中直接解析即可:
import os import json data = json.loads(os.environ["FOO"])
无法修改Bash端时的处理方案
如果必须处理已存在的带转义的环境变量值,可以用ast.literal_eval安全解析转义,再解析JSON:
import os import json import ast bar = os.environ["FOO"] # 先解析转义字符串,还原为原始JSON文本 raw_json = ast.literal_eval(f'"{bar}"') # 解析JSON data = json.loads(raw_json)
ast.literal_eval会正确处理字符串中的转义序列,不会误删JSON本身合法的转义(比如JSON字符串内的\"),比直接全局替换斜杠更可靠。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

