Konvertieren Sie die JSON-Zeichenfolge mit Python in ein Diktat

413

Ich bin ein bisschen verwirrt mit JSON in Python. Für mich scheint es ein Wörterbuch zu sein, und aus diesem Grund versuche ich das zu tun:

{
    "glossary":
    {
        "title": "example glossary",
        "GlossDiv":
        {
            "title": "S",
            "GlossList":
            {
                "GlossEntry":
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef":
                    {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

Aber wenn ich das tue print dict(json), gibt es einen Fehler.

Wie kann ich diesen String in eine Struktur umwandeln und dann aufrufen json["title"], um ein "Beispielglossar" zu erhalten?

Frias
quelle

Antworten:

755

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']
Ignacio Vazquez-Abrams
quelle
9
Was ist der Unterschied zwischen json.load und json.loads?
Shivam Agrawal
5
@ShivamAgrawal: Genau das, was sagt es auf der Dose .
Ignacio Vazquez-Abrams
64
@ShivamAgrawal: Der Unterschied besteht darin, dass .load()ein Dateiobjekt analysiert wird. .loads()analysiert ein String- / Unicode-Objekt.
Fyngyrz
1
Es stört mich, dass der Autor dieser Funktion keine Wrapper-Funktion geschrieben hat, um eine Typprüfung der übergebenen Daten durchzuführen und automatisch die richtige Funktion zum Aufrufen auszuwählen. Ich mag auch nicht die vage verwendete Nomenklatur. Folgendes habe ich geschrieben, um dem entgegenzuwirken: def read_json(json_data): if (type(json_data) == str): return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): return json.load(json_data) Ich bin sicher, dass dies verbessert werden kann, aber jetzt können Sie d = read_json(j)eine json-Datei "str" ​​oder "file" aufrufen .
Jacques Mathieu
2
@JacquesMathieu, Hallo Jacques, danke für deine Funktion, ich habe eine kleine Verbesserung vorgenommen, da ich manchmal Wörterbücher verwende: def read_json (json_data): if (type (json_data) == str): # Für Strings wird json.loads (json_data) elif zurückgegeben (str (type (json_data)) == "<class '_io.TextIOWrapper'>"): #Für Dateien wird json.load (json_data) elif zurückgegeben (type (json_data) == dict): # Für Wörterbücher json.loads zurückgeben (json.dumps (json_data))
Gabriel Aizcorbe
98

Als ich anfing, json zu verwenden, war ich verwirrt und konnte es einige Zeit nicht herausfinden, aber schließlich bekam ich, was ich wollte.
Hier ist die einfache Lösung

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])
Hussain
quelle
Warum bist du zuerst Dumps (m)?
Han Van Pham
Ich habe es verwendet, um Serialisierung und Deserialisierung zu demonstrieren. Die Verwendung von loads(..)on '{"id": 2, "name": "hussain"}'sollte ebenso gut sein wie die akzeptierte Antwort.
Hussain
1
Dumps und Ladevorgänge funktionieren perfekt für mich, während die akzeptierte Antwort nicht lautet. Vielen Dank @Hussain, dass er mir ein timeFYI erspart hat . Ich versuche, loadsdynamische Zeichenfolgen mit utf-8-Codierung zu verwenden ...
Mohammed Sufian
19

Verwenden Sie simplejson oder cjson für Beschleunigungen

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)
locojay
quelle
16

Wenn Sie der Datenquelle vertrauen, können Sie evalIhre Zeichenfolge in ein Wörterbuch konvertieren:

eval(your_json_format_string)

Beispiel:

>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)

>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}

>>> print type(x), type(y)
<type 'str'> <type 'dict'>

>>> print y['a'], type(y['a'])
1 <type 'int'>

>>> print y['a'], type(y['b'])
1 <type 'bool'>

>>> print y['a'], type(y['c'])
1 <type 'str'>
kakhkAtion
quelle
1
Die Zeichenfolge in Ihrem Beispiel ist nicht JSON.
Bfontaine
1
Wahr. Es handelt sich um ein Wörterbuch, das leicht als JSON geladen / ausgegeben werden kann (und natürlich benötigen Sie möglicherweise eine benutzerdefinierte JSON-Encoder-Funktion, wenn Ihr Wörterbuch keine JSON-Werte enthält).
kakhkAtion
3
Nein. Sie sollten Eingabedaten niemals als Code auswerten. Dies mag Ihr kleines Lieblingsprojekt sein, das Daten verwendet, denen Sie vertrauen, aber fehlerhafter Code kann wiederverwendet und schlechte Praktiken in realen Projekten wiederholt werden, sodass ein großer Sicherheitscode verbleibt.
NetworkMeister
Und deshalb beginnt meine Antwort mit "Wenn Sie der Datenquelle vertrauen"! Aber wahr, dies ist eher ein Hack und definitiv nicht die beste Vorgehensweise.
kakhkAtion
Sie können der Datenquelle vollkommen vertrauen, wenn es Ihre eigene ist. Dies ist tatsächlich nützlich, um ein stringifiziertes JS-Objekt in ein DIC in einen richtigen JSON-String zu konvertieren.
Vadorequest