Подтвердить что ты не робот

Дамп в JSON добавляет дополнительные двойные кавычки и экранирование кавычек

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

Они выглядят так:

"{\" creation_at\": \" Пт, авг, 08 11:04:40 +0000 2014\", \" id\": 497699913925292032,

Как мне этого избежать? Так должно быть:

{"creat_at": "Пт Авг 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'))

Непреднамеренное экранирование вызывает проблемы при чтении в файле JSON на более позднем этапе обработки.

4b9b3361

Ответ 1

Вы дважды кодируете свои строки 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')

Ответ 2

Другая ситуация, когда это нежелательное экранирование может произойти, если вы попытаетесь использовать 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 из эта функция... неправильно.)