Ich habe diesen JSON in einer Datei:
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": [
"id": "valore"
],
"om_points": "value",
"parameters": [
"id": "valore"
]
}
Ich habe dieses Skript geschrieben, um alle JSON-Daten zu drucken:
import json
from pprint import pprint
with open('data.json') as f:
data = json.load(f)
pprint(data)
Dieses Programm löst jedoch eine Ausnahme aus:
Traceback (most recent call last):
File "<pyshell#1>", line 5, in <module>
data = json.load(f)
File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 13 column 13 (char 213)
Wie kann ich den JSON analysieren und seine Werte extrahieren?
Ihre Daten sind ungültig JSON Format. Sie haben []
, wenn Sie {}
haben sollten:
[]
sind für JSON-Arrays, die in Python list
heißen{}
sind für JSON-Objekte, die in Python dict
heißenSo sollte Ihre JSON-Datei aussehen:
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": {
"id": "valore"
},
"om_points": "value",
"parameters": {
"id": "valore"
}
}
Dann können Sie Ihren Code verwenden:
import json
from pprint import pprint
with open('data.json') as f:
data = json.load(f)
pprint(data)
Mit Daten können Sie jetzt auch Werte wie die folgenden finden:
data["maps"][0]["id"]
data["masks"]["id"]
data["om_points"]
Probieren Sie diese aus und sehen Sie, ob es Sinn macht.
Dein data.json
sollte so aussehen:
{
"maps":[
{"id":"blabla","iscategorical":"0"},
{"id":"blabla","iscategorical":"0"}
],
"masks":
{"id":"valore"},
"om_points":"value",
"parameters":
{"id":"valore"}
}
Ihr Code sollte sein:
import json
from pprint import pprint
with open('data.json') as data_file:
data = json.load(data_file)
pprint(data)
Beachten Sie, dass dies nur in Python 2.6 und höher funktioniert, da dies von der with
- -Anweisung abhängt. In Python 2.5 verwende from __future__ import with_statement
, in Python <= 2.4, siehe Justin Peels Antwort , worauf diese Antwort basiert.
Sie können nun auch auf einzelne Werte wie folgt zugreifen:
data["maps"][0]["id"] # will return 'blabla'
data["masks"]["id"] # will return 'valore'
data["om_points"] # will return 'value'
Justin Peels Antwort ist wirklich hilfreich, aber wenn Sie Python 3 verwenden, sollten Sie JSON folgendermaßen lesen:
with open('data.json', encoding='utf-8') as data_file:
data = json.loads(data_file.read())
Hinweis: Verwenden Sie json.loads
anstelle von json.load
. In Python 3 nimmt json.loads
einen Zeichenfolgenparameter an. json.load
akzeptiert einen dateiähnlichen Objektparameter. data_file.read()
gibt ein String-Objekt zurück.
Um ehrlich zu sein, denke ich nicht, dass es in den meisten Fällen ein Problem ist, alle JSON-Daten in den Speicher zu laden.
data = []
with codecs.open('d:\output.txt','rU','utf-8') as f:
for line in f:
data.append(json.loads(line))
"Ultra JSON" oder einfach "ujson" kann es verarbeiten, []
in Ihrer JSON-Dateieingabe zu haben. Wenn Sie eine JSON-Eingabedatei als Liste von JSON-Elementen in Ihr Programm einlesen; wie [{[{}]}, {}, [], etc...]
ujson kann mit jeder beliebigen Reihenfolge von Listen von Wörterbüchern und Wörterbüchern von Listen umgehen.
Sie finden ujson im Python-Paketindex und die API ist fast identisch mit der in Python integrierten json
-Bibliothek.
ujson ist auch viel schneller, wenn Sie größere JSON-Dateien laden. Sie können die Leistungsdetails im Vergleich zu anderen Python JSON-Bibliotheken über denselben Link anzeigen.
Wenn Sie Python3 verwenden, können Sie versuchen, Ihre JSON-Datei (connection.json
) zu ändern:
{
"connection1": {
"DSN": "con1",
"UID": "abc",
"PWD": "1234",
"connection_string_python":"test1"
}
,
"connection2": {
"DSN": "con2",
"UID": "def",
"PWD": "1234"
}
}
Verwenden Sie dann den folgenden Code:
connection_file = open('connection.json', 'r')
conn_string = json.load(connection_file)
conn_string['connection1']['connection_string_python'])
connection_file.close()
>>> test1
Hier gehts mit modifizierter data.json
Datei:
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": [{
"id": "valore"
}],
"om_points": "value",
"parameters": [{
"id": "valore"
}]
}
Sie können Daten über die Konsole aufrufen oder ausdrucken, indem Sie die folgenden Zeilen verwenden:
import json
from pprint import pprint
with open('data.json') as data_file:
data_item = json.load(data_file)
pprint(data_item)
Erwartete Ausgabe für print(data_item['parameters'][0]['id'])
:
{'maps': [{'id': 'blabla', 'iscategorical': '0'},
{'id': 'blabla', 'iscategorical': '0'}],
'masks': [{'id': 'valore'}],
'om_points': 'value',
'parameters': [{'id': 'valore'}]}
Erwartete Ausgabe für print(data_item['parameters'][0]['id'])
:
valore
Es gibt zwei Arten bei dieser Analyse.
Aus einer Datei können Sie Folgendes verwenden
import json
json = json.loads(open('/path/to/file.json').read())
value = json['key']
print json['value']
In diesem Artikel wird das vollständige Parsen und Abrufen von Werten anhand von zwei Szenarien erläutert. Parsen von JSON mithilfe von Python
Als Python3-Benutzer
Der Unterschied zwischen den Methoden load
und loads
ist besonders wichtig, wenn Sie JSON-Daten aus einer Datei lesen.
Wie in den Dokumenten angegeben:
json.load:
Deserialisieren Sie fp (eine .read () - unterstützende Textdatei oder Binärdatei, die ein JSON-Dokument enthält) mit dieser Konvertierungstabelle in ein Python -Objekt.
json.loads:
json.loads: Deserialisiert s (eine str-, byte- oder bytearray-Instanz, die ein JSON-Dokument enthält) mit dieser Konvertierungstabelle in ein Python -Objekt.
die Methode json.load kann geöffnete json-Dokumente direkt lesen, da sie Binärdateien lesen können.
with open('./recipes.json') as data:
all_recipes = json.load(data)
Als Ergebnis sind Ihre JSON-Daten in einem Format verfügbar, das gemäß der folgenden Konvertierungstabelle angegeben wurde:
https://docs.python.org/3.7/library/json.html#json-to-py-table