Dump to JSON fügt zusätzliche doppelte Anführungszeichen und das Anhalten von Anführungszeichen hinzu

80

Ich rufe Twitter-Daten mit einem Python-Tool ab und speichere diese im JSON-Format auf meiner Festplatte. Ich bemerkte ein unbeabsichtigtes Entweichen der gesamten Datenzeichenfolge für einen Tweet, der in doppelte Anführungszeichen eingeschlossen war. Darüber hinaus werden alle doppelten Anführungszeichen der tatsächlichen JSON-Formatierung mit einem Backslash maskiert.

Sie sehen so aus:

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

Wie vermeide ich das? Es sollte sein:

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

Mein File-Out-Code sieht folgendermaßen aus:

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

Das unbeabsichtigte Escapezeichen verursacht Probleme beim Einlesen der JSON-Datei in einem späteren Verarbeitungsschritt.

toobee
quelle

Antworten:

135

Sie codieren Ihre JSON-Zeichenfolgen doppelt. dataist bereits eine JSON-Zeichenfolge und muss nicht erneut codiert werden :

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

Schreiben Sie diese einfach direkt in Ihre Datei:

with open('data{}.txt'.format(self.timestamp), 'a') as f:
    f.write(data + '\n')
Martijn Pieters
quelle
f.write (data + '\ n') - korreliert mit - data = encoded_data - aus Ihrem Beispiel.
Rich Elswick
@RichElswick Das OP verwendet die Variable data, die bereits codierte JSON-Daten enthält. Ja, ich habe den Variablennamen verwendet, um encoded_datazu veranschaulichen, was vor sich ging.
Martijn Pieters
9

Eine andere Situation, in der dieses unerwünschte Entkommen auftreten kann, besteht darin, dass Sie versuchen, json.dump () für die vorverarbeitete Ausgabe von json.dumps () zu verwenden. Zum Beispiel

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

wird darin enden, dass

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

Um dies zu vermeiden, müssen Sie Wörterbücher übergeben und nicht die Ausgabe von json.dumps (), z

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

welches das gewünschte ausgibt

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

(Warum sollten Sie die innere Liste mit json.dumps () vorverarbeiten, fragen Sie? Nun, ich hatte eine andere Funktion, die diese innere Liste aus anderen Dingen erstellte, und ich dachte, es wäre sinnvoll, ein json-Objekt von zurückzugeben diese Funktion ... falsch.)

Mike Maxwell
quelle