Дамп у JSON додає додаткові подвійні лапки та екрануючі лапки


86

Я отримую дані Twitter за допомогою інструменту Python і скидаю їх у форматі JSON на мій диск. Я помітив ненавмисне екранування всього рядка даних для твіту, укладеного в подвійні лапки. Крім того, усі подвійні лапки фактичного форматування JSON обробляються зворотною рискою рискою.

Вони виглядають так:

"{\" created_at \ ": \" пт 08 серпня 11:04:40 +0000 2014 \ ", \" id \ ": 497699913925292032,

Як мені цього уникнути? Вона повинна бути:

{"created_at": "Пт, 8 серпня 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'))

Ненавмисне екранування викликає проблеми при читанні у файлі JSON на наступному етапі обробки.

Відповіді:


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 (дані + '\ n') - відповідає - data = encoded_data - з вашого прикладу.
Rich Elswick

@RichElswick OP використовує змінну data, яка містить уже закодовані дані JSON, так що так, я використовував ім'я змінної, encoded_dataщоб проілюструвати, що відбувається.
Мартін Пітерс

9

Інша ситуація, коли може статися це небажане втеча, це якщо ви спробуєте використовувати json.dump () на попередньо обробленому виводі json.dumps (). Наприклад

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-об'єкт з ця функція ... Неправильна.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.