如何从环境变量中获取原始json字符串?

0 投票
2 回答
31 浏览
提问于 2025-04-12 15:16

在BASH中,我可以通过jq把JSON存储到一个环境变量里:

export FOO=$(curl ... | jq -Rs)

现在,如果我把它加载到Python中:

bar=os.environ["FOO"]

bar会变成类似于:{\\"this\\":\\"that\\"}的样子,这在用json加载时会出现问题:

json.loads(bar) # error

我尝试了几种方法,包括使用reprrf'{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}}

撰写回答