在主机上,我有一个带有引号的环境变量,如下所示:
export VALUE_WITH_QUOTE_FROM_OS='quote"value'当我在巴什上回音的时候,很好
#echo $VALUE_WITH_QUOTE_FROM_OS
quote"value我有以下json字符串:
json_str = '{"key":"${VALUE_WITH_QUOTE_FROM_OS}"}'然后,在进一步处理之前,我希望在python脚本中扩展环境变量,如下所示
json_str = os.path.expandvars(json_str)
json_dict = json.loads(json_str)但是,这种扩展会破坏json语法,因为json_str已经成为
'{"key":"quote"value"}' (<== bad unescaped quote in the value)而不是
'{"key":"quote\"value"}' 在扩展值时,我是否可以通知os.path.expandvars()以转义双引号?如果不是,我应该如何展开环境变量,以便可以转义双引号。
注释1环境变量的值是一个安全令牌,所以我必须保持双引号不变。
Note 2当前的json接口已经被确定并被广泛使用。此json_str被传递给我,因此我应该并且必须只展开json字符串中由${}表示的环境变量,不允许进行其他修改。
Note 3此json_str非常大,具有复杂、动态、嵌套的结构,并且由无法访问主机os环境变量的多个客户端使用。虽然我可以先加载json_str,遍历字典来解析环境变量,然后将dict转储回json_str,然后再分派给所有客户端,但我认为它比作为字符串处理它的效率要低。
谢谢。
发布于 2016-03-10 00:14:37
我当然不能保证这将具有os.path的可移植性,但这应该主要适用于使用posix的系统--我认为:
import re
import os
import json
regex = re.compile(r'\$(\w+|\{[^}]*\})')
json_str = '{"key":"${FOO}"}'
def os_expandvar(match):
    v = match.group(1)
    if v.startswith('{') and v.endswith('}'):
        v = v[1:-1]
    return json.dumps(os.environ.get(v, ''))[1:-1]
print(regex.sub(os_expandvar, json_str))正则表达式(和一般的实现思想)是从os.path.expandvars在posixpath模块中的实现中借用来的。为了简化答案,我去掉了大量的复杂性,但是如果您发现需要它,您可以将它放回去。
这应该处理替换字符串为$FOO或${FOO}的情况,就像posix系统中的典型情况一样。
这里还有其他选择..。通过给出的示例,您可以首先解码json,然后展开所有的值。根据json的格式,您可能需要一个递归函数来完成工作:
# untested
def json_expandvars(o):
    if isinstance(o, dict):
       return {json_expandvars(k): json_expandvars(v) for k, v in o.items()}
    elif isinstance(o, list):
       return [json_expandvars(v) for v in o]
    elif isinstance(o, basestring):
       return os.path.expandvars(o)
    else:
       return o
json_dict = json_expandvars(json.loads(json_str))发布于 2016-03-10 00:31:53
os.path.expandvars不可能知道结果需要一个有效的JSON字符串,引号转义。
相反,在将JSON解码为字典之后,展开环境变量。
json_dict = json.loads(json_str);
json_dict['key'] = os.path.expandvars(json_dict['key']);https://stackoverflow.com/questions/35904997
复制相似问题