如何从环境变量中获取原始json字符串?
在BASH中,我可以通过jq把JSON存储到一个环境变量里:
export FOO=$(curl ... | jq -Rs)
现在,如果我把它加载到Python中:
bar=os.environ["FOO"]
bar
会变成类似于:{\\"this\\":\\"that\\"}
的样子,这在用json
加载时会出现问题:
json.loads(bar) # error
我尝试了几种方法,包括使用repr
、rf'{os.environ["FOO"]}'
等等,但似乎没有一种内部管理的方法可以去掉多余的斜杠。
我该如何通过字符串函数去掉这些多余的斜杠?我不想简单地用一个斜杠替换掉它们,因为将来我可能还需要修改这段代码。
2 个回答
0
我试着重建这个:
export FOO=$(curl https://jsonplaceholder.typicode.com/todos/1|jq -Rs)
在bash中看起来存储的是这样的:
"{\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"delectus aut autem\",\n \"completed\": false\n}"
然后在python的命令行中:
>>> import json
>>> import os
>>> json.loads(json.loads(os.environ["FOO"]))
{'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}
简单来说,json.loads()这个函数并不能保证你得到的Python对象是什么类型,它只是尽量把你给它的内容转换成Python可以理解的格式。所以如果里面有嵌套的内容,它也会处理。不过,当然了,最好还是能确保一开始环境中的数据格式是正确的,就像其他回答提到的那样。
2
在使用 jq
时,可以加上 -r
这个选项,这样输出的内容就会是原始文本。下面是一个使用 echo 的例子,显示了带有转义字符的结果:
echo '{"fruit":{"name":"apple","color":"green","price":1.20}}' | jq -Rs
# gives:
"{\"fruit\":{\"name\":\"apple\",\"color\":\"green\",\"price\":1.20}}\n"
但是如果加上 -r
,得到的结果仍然是 JSON 格式,只是没有那么多转义的引号了:
echo '{"fruit":{"name":"apple","color":"green","price":1.20}}' | jq -Rsr
# gives:
{"fruit":{"name":"apple","color":"green","price":1.20}}
这样 Python 就可以解析这些内容了。
export FOO=$(echo '{"fruit":{"name":"apple","color":"green","price":1.20}}' | jq -Rsr)
import os
import json
json.loads(os.environ['FOO'])
# returns:
# {'fruit': {'name': 'apple', 'color': 'green', 'price': 1.2}}