转储至JSON会添加其他双引号和转义引号


86

我正在使用Python工具检索Twitter数据,并将其以JSON格式转储到磁盘中。我注意到,用双引号引起的一条推文意外地转义了整个数据字符串。此外,实际JSON格式的所有双引号都以反斜杠转义。

他们看起来像这样:

“ {\” created_at \“:\”星期五8月8日11:04:40 +0000 2014 \“,\” id \“:497699913925292032,

如何避免这种情况?它应该是:

{“ created_at”:“ 2014年8月8日星期五11:04:40 +0000” .....

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

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'))

在以后的处理步骤中读取JSON文件时,意外的转义会导致问题。

Answers:


140

您正在对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\"}"

只需将这些直接写入文件即可:

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

f.write(data +'\ n')-从您的示例关联到-data = encoding_data。
Rich Elswick

@RichElswick OP使用变量data,其中包含已经编码的JSON数据,所以是的,我使用了变量名encoded_data来说明发生了什么。
马丁·彼得斯

9

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

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

将导致

{"foo": "[{\"bar\": 1}, {\"baz\": 2}]"}

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

json.dump({"foo": [{"bar": 1}, {"baz": 2}]},sys.stdout)

输出所需的

{"foo": [{"bar": 1}, {"baz": 2}]}

(为什么要用json.dumps()预处理内部列表?恩,我有另一个函数正在用其他东西创建该内部列表,我认为从中返回json对象是有意义的该功能...错误。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.