Salt la conținutul principal
Modulul 8 · Lecția 1 din 429/36 în curs~10 min
Lecții din modul (1/4)

JSON: serializați și analizați

JSON este cel mai răspândit format de schimb de date. Modulul json în biblioteca standard o gestionează nativ.

De la Python la JSON: dumps

json.dumps(object) serializează un obiect Python într-un șir JSON.

Python
import json

dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'

json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted

De la JSON la Python: loads

json.loads(string) analizează un șir JSON și returnează obiecte Python.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

Maparea tipului

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

Din fișier: dump / load

Python
with open("config.json", "w") as f:
    json.dump(dati, f, indent=2)

with open("config.json") as f:
    dati = json.load(f)

Fără „s” de sfârșit, acestea funcționează pe fișiere (asemănătoare fișierelor), cu „s” pe șiruri.

Tipuri neserializabile: default

datetime, set, clasele dvs. personalizate nu sunt serializabile în mod implicit:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

Puteți trece o funcție default care vă spune cum să le transformați:

Python
def converti(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"non serializzabile: {type(obj)}")

json.dumps({"ora": datetime.datetime.now()}, default=converti)

JSON și operațiuni cu fișiere

Biblioteca standard oferă, de asemenea, json.dump() și json.load() (fără „s”) pentru a scrie și a citi date JSON direct în și din fișiere, asociindu-se în mod natural cu managerii de context:

Python
with open("data.json", "w") as f:
    json.dump(data, f)

Încearcă

Exercițiu#python.m8.l1.e1
Încercări: 0Se încarcă…

Având în vedere `data = {'nome': 'Ada', 'anni': 36}`, serializați-l la JSON cu indent=2 și atribuiți variabilei `json_str`. Evaluați `json_str`.

Se încarcă editorul...
Afișează indiciu

json.dumps(date, indent=2)

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#python.m8.l1.e2
Încercări: 0Se încarcă…

Având în vedere șirul JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', analizați-l cu json.loads în date și calculați suma valorilor „v” în total. Evaluați totalul.

Se încarcă editorul...
Afișează indiciu

json.loads returnează o listă de dict.

Soluție disponibilă după 3 încercări

Provocare suplimentară

Exercițiu#python.m8.l1.e3
Încercări: 0Se încarcă…

Având în vedere șirul JSON \`json_data = '{"name": "Alice", "age": 30}'\`, decodați-l într-un dicționar Python folosind \`json.loads\`. Extrageți valoarea asociată cheii \`'name'\` și stocați-o în \`user_name\`. În cele din urmă, evaluați \`nume_utilizator\`.

Se încarcă editorul...
Afișează indiciu

Utilizați json.loads(json_data) pentru a decoda, apoi accesați prin data['name'].

Soluție disponibilă după 3 încercări