it-swarm.com.de

Warum kann Python diese JSON-Daten nicht analysieren?

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?

1377
michele

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ßen

So 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.

2066
Justin Peel

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'
303
Bengt

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.

64
Geng Jiawen
data = []
with codecs.open('d:\output.txt','rU','utf-8') as f:
    for line in f:
       data.append(json.loads(line))
53
user1743724

"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.

13
moeabdol

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
7
sushmit

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
6
JoboFive

Es gibt zwei Arten bei dieser Analyse.

  1. Analysieren von Daten aus einer Datei aus einem Systempfad
  2. Parsing von JSON von Remote-URL.

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

5
Bibin Wilson

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

4
muratgozel