Python Language
JSON-Modul
Suche…
Bemerkungen
Die vollständige Dokumentation einschließlich versionsspezifischer Funktionen finden Sie in der offiziellen Dokumentation .
Typen
Standardwerte
Das json
Modul übernimmt standardmäßig das Kodieren und Dekodieren der folgenden Typen:
Deserialisierungsarten:
JSON | Python |
---|---|
Objekt | diktieren |
Array | Liste |
Schnur | str |
Nummer (int) | int |
Nummer (real) | schweben |
wahr falsch | Wahr falsch |
Null | Keiner |
Das json
Modul versteht auch NaN
, Infinity
und -Infinity
als ihre entsprechenden Float-Werte, was außerhalb der JSON-Spezifikation liegt.
Serialisierungsarten:
Python | JSON |
---|---|
diktieren | Objekt |
Liste, Tupel | Array |
str | Schnur |
int, float, (int / float) abgeleitete Enums | Nummer |
Wahr | wahr |
Falsch | falsch |
Keiner | Null |
Um die Kodierung von NaN
, Infinity
und -Infinity
, müssen Sie mit allow_nan=False
kodieren. Dadurch wird ein ValueError
wenn Sie versuchen, diese Werte zu kodieren.
Kundenspezifische (De-) Serialisierung
Es gibt verschiedene Hooks, mit denen Sie mit Daten umgehen können, die unterschiedlich dargestellt werden müssen. Die Verwendung von functools.partial
ermöglicht es Ihnen, die relevanten Parameter aus praktischen functools.partial
teilweise auf diese Funktionen anzuwenden.
Serialisierung:
Sie können eine Funktion bereitstellen, die Objekte bearbeitet, bevor sie wie folgt serialisiert werden:
# my_json module
import json
from functools import partial
def serialise_object(obj):
# Do something to produce json-serialisable data
return dict_obj
dump = partial(json.dump, default=serialise_object)
dumps = partial(json.dumps, default=serialise_object)
De-Serialisierung:
Es gibt verschiedene Hooks, die von den Json-Funktionen behandelt werden, z. B. object_hook und parse_float. Eine vollständige Liste Ihrer Python-Version finden Sie hier .
# my_json module
import json
from functools import partial
def deserialise_object(dict_obj):
# Do something custom
return obj
def deserialise_float(str_obj):
# Do something custom
return obj
load = partial(json.load, object_hook=deserialise_object, parse_float=deserialise_float)
loads = partial(json.loads, object_hook=deserialise_object, parse_float=deserialise_float)
Weitere benutzerdefinierte (De) Serialisierung:
Das json
Modul ermöglicht auch die Erweiterung / Ersetzung des json.JSONEncoder
und des json.JSONDecoder
, um verschiedene Typen zu behandeln. Die oben dokumentierten Hooks können als Standardwerte hinzugefügt werden, indem eine gleichnamige Methode erstellt wird. Um diese zu verwenden, übergeben Sie die Klasse einfach als cls
Parameter an die entsprechende Funktion. Die Verwendung von functools.partial
ermöglicht es Ihnen, den cls-Parameter zur Vereinfachung auf diese Funktionen anzuwenden, z
# my_json module
import json
from functools import partial
class MyEncoder(json.JSONEncoder):
# Do something custom
class MyDecoder(json.JSONDecoder):
# Do something custom
dump = partial(json.dump, cls=MyEncoder)
dumps = partial(json.dumps, cls=MyEncoder)
load = partial(json.load, cls=MyDecoder)
loads = partial(json.loads, cls=MyDecoder)
JSON aus Python-Diktieren erstellen
import json
d = {
'foo': 'bar',
'alice': 1,
'wonderland': [1, 2, 3]
}
json.dumps(d)
Das obige Snippet gibt Folgendes zurück:
'{"wonderland": [1, 2, 3], "foo": "bar", "alice": 1}'
Erstellen von Python-Diktaten aus JSON
import json
s = '{"wonderland": [1, 2, 3], "foo": "bar", "alice": 1}'
json.loads(s)
Das obige Snippet gibt Folgendes zurück:
{u'alice': 1, u'foo': u'bar', u'wonderland': [1, 2, 3]}
Daten in einer Datei speichern
Das folgende Snippet codiert die in d
gespeicherten Daten in JSON und speichert sie in einer Datei (ersetzen Sie filename
durch den tatsächlichen Dateinamen).
import json
d = {
'foo': 'bar',
'alice': 1,
'wonderland': [1, 2, 3]
}
with open(filename, 'w') as f:
json.dump(d, f)
Daten aus einer Datei abrufen
Das folgende Snippet öffnet eine JSON-codierte Datei (Ersetzen Sie filename
durch den tatsächlichen Dateinamen) und gibt das in der Datei gespeicherte Objekt zurück.
import json
with open(filename, 'r') as f:
d = json.load(f)
`load` vs.` load`, `dump` vs.` dumps`
Das json
Modul enthält Funktionen zum Lesen und Schreiben in und aus Unicode-Zeichenfolgen sowie zum Lesen und Schreiben in und aus Dateien. Diese werden durch nachgestellte s
im Funktionsnamen unterschieden. In diesen Beispielen verwenden wir ein StringIO-Objekt, aber für jedes dateiähnliche Objekt gelten dieselben Funktionen.
Hier verwenden wir die String-basierten Funktionen:
import json
data = {u"foo": u"bar", u"baz": []}
json_string = json.dumps(data)
# u'{"foo": "bar", "baz": []}'
json.loads(json_string)
# {u"foo": u"bar", u"baz": []}
Und hier verwenden wir die dateibasierten Funktionen:
import json
from io import StringIO
json_file = StringIO()
data = {u"foo": u"bar", u"baz": []}
json.dump(data, json_file)
json_file.seek(0) # Seek back to the start of the file before reading
json_file_content = json_file.read()
# u'{"foo": "bar", "baz": []}'
json_file.seek(0) # Seek back to the start of the file before reading
json.load(json_file)
# {u"foo": u"bar", u"baz": []}
Wie Sie sehen, besteht der Hauptunterschied darin, dass Sie beim Ablegen von Json-Daten das Dateihandle an die Funktion übergeben müssen, anstatt den Rückgabewert zu erfassen. Erwähnenswert ist auch, dass Sie vor dem Lesen oder Schreiben den Anfang der Datei suchen müssen, um eine Beschädigung der Daten zu vermeiden. Wenn Sie eine Datei öffnen, wird der Cursor auf Position 0
import json
json_file_path = './data.json'
data = {u"foo": u"bar", u"baz": []}
with open(json_file_path, 'w') as json_file:
json.dump(data, json_file)
with open(json_file_path) as json_file:
json_file_content = json_file.read()
# u'{"foo": "bar", "baz": []}'
with open(json_file_path) as json_file:
json.load(json_file)
# {u"foo": u"bar", u"baz": []}
Wenn Sie beide Arten des Umgangs mit json-Daten haben, können Sie idiomatisch und effizient mit auf json pyspark
Formaten arbeiten, wie z.
# loading from a file
data = [json.loads(line) for line in open(file_path).splitlines()]
# dumping to a file
with open(file_path, 'w') as json_file:
for item in data:
json.dump(item, json_file)
json_file.write('\n')
Aufruf von "json.tool" von der Befehlszeile aus, um die JSON-Ausgabe zu drucken
Einige JSON-Datei "foo.json" wie:
{"foo": {"bar": {"baz": 1}}}
Wir können das Modul direkt von der Befehlszeile aus aufrufen (den Dateinamen als Argument übergeben), um es hübsch auszudrucken:
$ python -m json.tool foo.json
{
"foo": {
"bar": {
"baz": 1
}
}
}
Das Modul wird auch Eingaben von STDOUT entgegennehmen, also könnten wir (in Bash) auch Folgendes tun:
$ cat foo.json | python -m json.tool
JSON-Ausgabe formatieren
Nehmen wir an, wir haben folgende Daten:
>>> data = {"cats": [{"name": "Tubbs", "color": "white"}, {"name": "Pepper", "color": "black"}]}
Wenn Sie dies einfach als JSON-Dumping ausführen, macht das hier nichts Besonderes:
>>> print(json.dumps(data))
{"cats": [{"name": "Tubbs", "color": "white"}, {"name": "Pepper", "color": "black"}]}
Einzug festlegen, um eine schönere Ausgabe zu erhalten
Wenn wir hübsch drucken möchten, können wir eine indent
festlegen:
>>> print(json.dumps(data, indent=2))
{
"cats": [
{
"name": "Tubbs",
"color": "white"
},
{
"name": "Pepper",
"color": "black"
}
]
}
Schlüssel alphabetisch sortieren, um eine konsistente Ausgabe zu erhalten
Standardmäßig ist die Reihenfolge der Schlüssel in der Ausgabe nicht definiert. Wir können sie in alphabetischer Reihenfolge erhalten, um sicherzustellen, dass wir immer die gleiche Ausgabe erhalten:
>>> print(json.dumps(data, sort_keys=True))
{"cats": [{"color": "white", "name": "Tubbs"}, {"color": "black", "name": "Pepper"}]}
Whitespace entfernen, um kompakte Ausgabe zu erhalten
Wir möchten vielleicht die unnötigen Leerzeichen entfernen, was durch das Setzen von Trennzeichen-Strings von den Standardwerten ', '
und ': '
>>>print(json.dumps(data, separators=(',', ':')))
{"cats":[{"name":"Tubbs","color":"white"},{"name":"Pepper","color":"black"}]}
JSON-Codierung von benutzerdefinierten Objekten
Wenn wir nur folgendes versuchen:
import json
from datetime import datetime
data = {'datetime': datetime(2016, 9, 26, 4, 44, 0)}
print(json.dumps(data))
Wir erhalten eine Fehlermeldung, dass TypeError: datetime.datetime(2016, 9, 26, 4, 44) is not JSON serializable
.
Um das datetime-Objekt ordnungsgemäß serialisieren zu können, müssen Sie benutzerdefinierten Code für die Konvertierung schreiben:
class DatetimeJSONEncoder(json.JSONEncoder):
def default(self, obj):
try:
return obj.isoformat()
except AttributeError:
# obj has no isoformat method; let the builtin JSON encoder handle it
return super(DatetimeJSONEncoder, self).default(obj)
und dann diese Encoder-Klasse anstelle von json.dumps
:
encoder = DatetimeJSONEncoder()
print(encoder.encode(data))
# prints {"datetime": "2016-09-26T04:44:00"}