Jak parsować JSON w Pythonie?


282

Mój projekt obecnie otrzymuje komunikat JSON w pythonie, z którego muszę wyciągnąć fragmenty informacji. W tym celu ustawmy na prosty JSON w ciągu:

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

Do tej pory generowałem żądania JSON przy użyciu listy json.dumps, ale potem , przeciwnie do tego, myślę, że muszę użyć json.loads. Jednak nie miałem z tym dużo szczęścia. Czy ktoś mógłby dostarczyć mi fragment kodu, który zwróciłby "2"dane wejściowe z "two"powyższego przykładu?


8
Uwaga : dla tych, którzy przychodzą tutaj z danymi, które używają 'ograniczników ciągów pojedynczych cudzysłowów, być może przypadkowo utworzono reprezentację ciągu dla słowników Python. JSON zawsze" będzie używać ograniczników . Jeśli tak, napraw kod, który generuje dane wyjściowe do użycia json.dumps()zamiast str()lub repr(), i przejdź do Konwersja reprezentacji ciągu słownika na słownik? aby dowiedzieć się, jak odzyskać dane w języku Python. Inne wskazówki, które znasz dosłownie Python? Poszukaj None, Truelub FalseJSON użyje null, truei false.
Martijn Pieters

Ci, którzy nie mają jsonStr, ale listę słowników (być może z 'ogranicznikami ciągów pojedynczych cudzysłowów), również tutaj: stackoverflow.com/questions/41168558/...
Lorenz

Odpowiedzi:


493

Bardzo prosty:

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

Spójrz też na simplejson, jeśli potrzebujesz lepszej wydajności. Nowsze wersje zawierają optymalizacje, które znacznie poprawiają czytanie i pisanie.
unode

2
Jestem rzeczywiście przy simplejson już: import simplejson as json. Zapomniałem wspomnieć, ale dziękuję :)
ingh.am

Rozumiem. Używał .loadmetody zamiast.loads
Sunil Kumar

85

Czasami twój json nie jest ciągiem. Na przykład, jeśli otrzymujesz json z adresu URL takiego:

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

musisz użyć json.load, a nie json.loads:

j_obj = json.load(j)

(łatwo zapomnieć: „s” oznacza „ciąg”)


Aby dodać, że możesz pobrać treść ciągu, wywołując j.read (), a następnie użyj metody load. W każdym przypadku w tym przypadku metoda load () dba o wywołanie .read ()
rkachach

51

W przypadku adresu URL lub pliku użyj json.load(). W przypadku łańcucha z zawartością .json użyj 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']

26

Oto prosty przykład, który może ci pomóc:

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)

Dane wyjściowe powyższego kodu będą następujące:

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

Zauważ, że możesz ustawić argument ident dump, aby wydrukować go w ten sposób (na przykład, gdy używasz print json.dumps (data, wcięcie = 4)):

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

-2

Może używać modułów json lub ast python:

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

1
Nie możesz użyć tej ast.literal_eval()funkcji dla JSON, ponieważ poza trywialnymi przykładami zawierającymi tylko tekst i liczby całkowite będziesz mieć problemy. JSON to nie Python . To, że niektóre JSON można analizować ast.literal_eval(), nie czyni z tego właściwego podejścia.
Martijn Pieters

1
Na przykład nie można analizować r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'za pomocą ast.literal_eval(), ponieważ zawiera wartości null, wartość boolowską i pojedynczy punkt kodowy inny niż BMP. JSON reprezentuje te wartości inaczej niż to, w jaki sposób literały Python mogłyby je reprezentować. json.loads()Z drugiej strony, nie ma problemów z tym wejściem i prawidłowo dekoduje że do {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters

1
Następnie ast.literal_eval()jest nieco wolniejszy i nie można go dostosowywać. Nigdy nie należy go używać do dekodowania JSON .
Martijn Pieters
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.