Python:转储到Json添加额外的双引号和转义引号

too*_*bee 55 python json

我正在使用python工具检索Twitter数据并将它们以JSon格式转储到我的磁盘.我注意到用双引号括起来的推文的整个数据字符串的意外转义.此外,实际Json格式的所有双引号都使用反斜杠进行转义.

它们看起来像这样:

"{\"created_at \":\"Fri Aug 08 11:04:40 +0000 2014 \",\"id \":497699913925292032,

我该如何避免?它应该是:

{"created_at":"Fri Aug 08 11:04:40 +0000 2014".....

我的文件输出代码如下所示:

with io.open('data'+self.timestamp+'.txt', 'a', encoding='utf-8') as f:
            f.write(unicode(json.dumps(data, ensure_ascii=False)))
            f.write(unicode('\n'))
Run Code Online (Sandbox Code Playgroud)

意外的转义会导致在稍后的处理步骤中读取json文件中的问题.

Mar*_*ers 99

您正在对JSON字符串进行双重编码.data已经 JSON字符串,并且不需要进行编码再次:

>>> import json
>>> not_encoded = {"created_at":"Fri Aug 08 11:04:40 +0000 2014"}
>>> encoded_data = json.dumps(not_encoded)
>>> print encoded_data
{"created_at": "Fri Aug 08 11:04:40 +0000 2014"}
>>> double_encode = json.dumps(encoded_data)
>>> print double_encode
"{\"created_at\": \"Fri Aug 08 11:04:40 +0000 2014\"}"
Run Code Online (Sandbox Code Playgroud)

只需将这些直接写入您的文件:

with open('data{}.txt'.format(self.timestamp), 'a') as f:
    f.write(data + '\n')
Run Code Online (Sandbox Code Playgroud)


Mik*_*ell 9

可能发生这种不需要的转义的另一种情况是,如果您尝试在 json.dumps() 的预处理输出上使用 json.dump()。例如

import json, sys
json.dump({"foo": json.dumps([{"bar": 1}, {"baz": 2}])},sys.stdout)
Run Code Online (Sandbox Code Playgroud)

会导致

{"foo": "[{\"bar\": 1}, {\"baz\": 2}]"}
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,您需要传递字典而不是 json.dumps() 的输出,例如

json.dump({"foo": [{"bar": 1}, {"baz": 2}]},sys.stdout)
Run Code Online (Sandbox Code Playgroud)

输出所需的

{"foo": [{"bar": 1}, {"baz": 2}]}
Run Code Online (Sandbox Code Playgroud)

(你问为什么要用 json.dumps() 预处理内部列表?嗯,我有另一个函数从其他东西中创建该内部列表,我认为从那个函数……错了。)