Wie analysiere ich JSON in Python?

281

Mein Projekt empfängt derzeit eine JSON-Nachricht in Python, aus der ich Informationen abrufen muss. Zu diesem Zweck setzen wir es auf einen einfachen JSON in einer Zeichenfolge:

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

Bisher habe ich JSON-Anfragen mithilfe einer Liste generiert und dann json.dumps, aber um das Gegenteil davon zu tun, muss ich sie verwenden json.loads. Ich hatte jedoch nicht viel Glück damit. Könnte mir jemand einen Ausschnitt zur Verfügung stellen, der "2"mit der Eingabe von "two"im obigen Beispiel zurückkehren würde?

ingh.am
quelle
8
Hinweis : Für diejenigen, die mit Daten hierher kommen, die 'Zeichenfolgenbegrenzer in einfachen Anführungszeichen verwenden, haben Sie möglicherweise stattdessen versehentlich Zeichenfolgendarstellungen für Python-Wörterbücher erstellt. JSON verwendet immer "Trennzeichen . Wenn ja, reparieren Sie Ihren Code, der diese Ausgabe json.dumps()anstelle von str()oder erzeugt repr(), und gehen Sie zu Konvertieren einer Zeichenfolgendarstellung eines Wörterbuchs in ein Wörterbuch? um herauszufinden, wie Sie Ihre Python-Daten wiederherstellen können. Andere Hinweise, die Sie ein Python-Literal haben? Suchen Sie nach None, Trueoder Falsewürde JSON verwenden null, true& false.
Martijn Pieters
Wer kein jsonStr, sondern eine Liste von Wörterbüchern hat (möglicherweise mit 'einfachen Anführungszeichen), kann auch hier nachsehen: stackoverflow.com/questions/41168558/…
Lorenz

Antworten:

492

Sehr einfach:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']
John Giotta
quelle
Außerdem haben Sie einen Blick auf simplejson wenn Sie eine bessere Leistung benötigen. Neuere Versionen bieten Optimierungen, die das Lesen und Schreiben erheblich verbessern.
Unode
2
Ich benutze simplejson eigentlich schon : import simplejson as json.
Ich habe
Verstanden. Verwendete .loadMethode anstelle von.loads
Sunil Kumar
85

Manchmal ist dein json kein String. Zum Beispiel, wenn Sie einen JSON von einer URL wie dieser erhalten:

j = urllib2.urlopen('http://site.com/data.json')

Sie müssen json.load verwenden, nicht json.loads:

j_obj = json.load(j)

(es ist leicht zu vergessen: das 's' steht für 'string')

Jisaacstone
quelle
Nur um hinzuzufügen, dass Sie den String-Inhalt erhalten können, indem Sie j.read () aufrufen und dann die load-Methode verwenden. In jedem Fall sorgt die load () -Methode dafür, dass die .read ()
rkachach am
51

Verwenden Sie für URL oder Datei json.load(). Verwenden Sie für Zeichenfolgen mit .json-Inhalt json.loads().

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']
Mohammad Shahid Siddiqui
quelle
26

Das folgende einfache Beispiel kann Ihnen helfen:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

Die Ausgabe für den obigen Code lautet:

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

Beachten Sie, dass Sie das ident-Argument von dump so festlegen können, dass es wie folgt gedruckt wird (z. B. bei Verwendung von print json.dumps (data, indent = 4)):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}
Venkat
quelle
-2

Kann entweder json- oder ast-Python-Module verwenden:

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2
Biranchi
quelle
1
Sie können nicht die Verwendung ast.literal_eval()Funktion für JSON, weil jenseits Ihrer trivial Text-und-integer-nur Beispiele , die Sie wird auf Probleme stoßen. JSON ist nicht Python . Nur weil einige JSONs analysiert werden können, ist ast.literal_eval()dies kein angemessener Ansatz.
Martijn Pieters
1
Zum Beispiel können Sie nicht analysieren r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'verwenden ast.literal_eval(), weil es NULL - Wert enthält, einen Booleschen Wert, und einen einzigen Nicht-BMP - Codepunkt. JSON stellt diese Werte anders dar als Python-Literale. json.loads()auf der anderen Seite, hat keine Probleme mit diesem Eingang und dekodiert richtig , dass zu {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters
1
Als nächstes ast.literal_eval()ist es etwas langsamer und kann nicht angepasst werden. Sie sollten es niemals zum Dekodieren von JSON verwenden .
Martijn Pieters