Zrzut do formatu JSON dodaje dodatkowe podwójne cudzysłowy i unikanie cudzysłowów


86

Pobieram dane z Twittera za pomocą narzędzia Python i zrzucam je w formacie JSON na mój dysk. Zauważyłem niezamierzone ucieczki całego ciągu danych dla tweeta ujętego w podwójne cudzysłowy. Ponadto wszystkie podwójne cudzysłowy rzeczywistego formatowania JSON są poprzedzane ukośnikiem odwrotnym.

Wyglądają tak:

„{\" created_at \ ": \" pt 8 sierpnia 11:04:40 + 0000 2014 \ ", \" id \ ": 497699913925292032,

Jak tego uniknąć? Powinno być:

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

Mój kod wyprowadzania plików wygląda następująco:

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

Niezamierzone zmiany znaczenia powodują problemy podczas wczytywania pliku JSON w późniejszym etapie przetwarzania.

Odpowiedzi:


140

Podwójnie kodujesz swoje ciągi JSON. datajest już ciągiem JSON i nie trzeba go ponownie kodować :

>>> 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\"}"

Po prostu zapisz je bezpośrednio w swoim pliku:

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

f.write (data + '\ n') - koreluje z - data = encoded_data - z twojego przykładu.
Rich Elswick

@RichElswick OP używa zmiennej data, która zawiera już zakodowane dane JSON, więc tak, użyłem nazwy zmiennej, encoded_dataaby zilustrować, co się dzieje.
Martijn Pieters

9

Inną sytuacją, w której może się zdarzyć niechciana zmiana znaczenia, jest próba użycia json.dump () na wstępnie przetworzonym wyjściu json.dumps (). Na przykład

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

spowoduje

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

Aby tego uniknąć, musisz raczej przekazywać słowniki niż dane wyjściowe json.dumps (), np

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

który wyprowadza pożądany plik

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

(Dlaczego miałbyś wstępnie przetwarzać wewnętrzną listę za pomocą json.dumps (), pytasz? Cóż, miałem inną funkcję, która tworzyła tę wewnętrzną listę z innych rzeczy i pomyślałem, że sensowne byłoby zwrócenie obiektu json z ta funkcja ... źle.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.