Python:防止json.load(文件)剥离转义字符

时间:2017-08-08 11:12:40

标签: python json

我正在从外部json文件将一些数据加载到Python中,这在大多数情况下都能正常工作。然而,偶尔有些数据包含转义字符,我需要保留这些字符。

原始输入文件:

{
    "version": 1,
    "query": "occasionally I \"need\" to escape \"double\" quotes"
} 

将其加载到python中:

import json

with open('input_file', 'r') as f:
    file = json.load(f)

修改

道歉我应该更清楚。我想要做的是如下:

'{}'.format(file['query'])

使用json.dumps

actual_query = '"datadog.agent.up".over("role:dns").by("host").last(1).count_by_status()'

json.dumps(actual_query)
'"\\"datadog.agent.up\\".over(\\"role:dns\\").by(\\"host\\").last(1).count_by_status()"'

2 个答案:

答案 0 :(得分:2)

这正是你应该期待的,我不确定为什么它不是你想要的。请记住,print命令返回变量的表示形式,例如print('\"')给出"

使用您的示例,您可以看到在输出结果时如何获取转义字符:

import json

a = r"""{
    "version": 1,
    "query": "occasionally I \"need\" to escape \"double\" quotes"
}"""

j = json.loads(a)


print j

print json.dumps(j)

给了我:

{u'query': u'occasionally I "need" to escape "double" quotes', u'version': 1}
{"query": "occasionally I \"need\" to escape \"double\" quotes", "version": 1}

(如果你原谅python2)

回复你的编辑:

'{}'.format(file['query']) == file['query']返回True - 您将字符串对象格式化为字符串。正如我所建议的,使用

json.dumps(file['query'])

返回

"occasionally I \"need\" to escape \"double\" quotes"

顺便说一句就是字符串:

'"occasionally I \\"need\\" to escape \\"double\\" quotes"'

您的“实际查询”也是如此:

query = '"\\"datadog.agent.up\\".over(\\"role:dns\\").by(\\"host\\").last(1).count_by_status()"'

给出

print json.dumps(query)
# "\"datadog.agent.up\".over(\"role:dns\").by(\"host\").last(1).count_by_status()"


with open('myfile.txt', 'w') as f:
    f.write(json.dumps(query))


# file contents:
# "\"datadog.agent.up\".over(\"role:dns\").by(\"host\").last(1).count_by_status()"

加倍\\

请注意,这就是为什么你需要明确你实际上要做的事情。

加倍\的技巧就是放入repr()

例如:

print repr(json.dumps(query))[1:-1] # to remove the ' from the beginning and end

# "\\"datadog.agent.up\\".over(\\"role:dns\\").by(\\"host\\").last(1).count_by_status()"

with open('myfile.txt', 'w') as f:
    f.write(repr(json.dumps(actual_query))[1:-1])

# file:
# "\\"datadog.agent.up\\".over(\\"role:dns\\").by(\\"host\\").last(1).count_by_status()"

你也可以在它上面.replace(r'\', r'\\')

答案 1 :(得分:0)

当我运行你的程序时,我得到的json看起来有点不同。 输出中的第二行周围有单引号。我不明白。

反正。虽然单引号解决了转义问题,但Json无效。有效的Json需要双引号。单引号只是Python中的字符串分隔符。

用代码替换代码中的最后一行 print(json.dumps(file))

返回适当的json。 { "query": "occasionally I \"need\" to escape \"double\" quotes", "version": 1 }

问候,

Melle的