Ce este JSON?
JSON este un format standard pentru schimbul de date, care este inspirat din JavaScript. În general, JSON este în format șir sau text. JSON reprezintă J ava S cript O bject N otation.
Sintaxa JSON: JSON este scrisă ca pereche cheie și valoare.
{"Key": "Value","Key": "Value",}
JSON este foarte asemănător cu dicționarul Python. Python acceptă JSON și are o bibliotecă încorporată ca JSON.
Biblioteca JSON din Python
Modulele „ marshal ” și „ pickle” externe ale Python mențin o versiune a bibliotecii JSON . Pentru a efectua operațiuni legate de JSON, cum ar fi codificarea și decodarea în Python, trebuie mai întâi să importați biblioteca JSON și pentru aceasta în fișierul dvs. .py ,
import json
Următoarele metode sunt disponibile în modulul JSON
Metodă | Descriere |
---|---|
halde () | codificarea obiectelor JSON |
dump () | scrierea șirului codificat pe fișier |
sarcini () | Decodează șirul JSON |
sarcină() | Decodează în timp ce fișierul JSON este citit |
Python către JSON (codificare)
Biblioteca JSON din Python efectuează în mod implicit următoarea traducere a obiectelor Python în obiecte JSON
Piton | JSON |
dict | Obiect |
listă | Matrice |
unicode | Şir |
număr - int, lung | număr - int |
pluti | număr - real |
Adevărat | Adevărat |
Fals | Fals |
Nici unul | Nul |
Conversia datelor Python în JSON se numește operație de codificare. Codificarea se face cu ajutorul metodei bibliotecii JSON - dumps ()
metoda dumps () convertește obiectul dicționar de python în format de date șir JSON.
Acum ne permite să realizăm primul nostru exemplu de codificare cu Python.
import jsonx = {"name": "Ken","age": 45,"married": True,"children": ("Alice","Bob"),"pets": ['Dog'],"cars": [{"model": "Audi A1", "mpg": 15.1},{"model": "Zeep Compass", "mpg": 18.1}]}# sorting result in asscending order by keys:sorted_string = json.dumps(x, indent=4, sort_keys=True)print(sorted_string)
Ieșire:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Să creăm un fișier JSON al dicționarului folosind aceeași funcție dump ()
# here we create new data_file.json file with write mode using file i/o operationwith open('json_file.json', "w") as file_write:# write json data into filejson.dump(person_data, file_write)
Ieșire:
Nimic de arătat
… În sistemul dvs. este creat json_file.json puteți verifica acel fișier.JSON către Python (decodare)
Decodificarea șir JSON se face cu ajutorul metodei incorporate sarcini () și încărcare () din biblioteca JSON în Python. Aici tabelul de traducere arată un exemplu de obiecte JSON către obiecte Python care sunt utile pentru a efectua decodarea în Python din șirul JSON.
JSON | Piton |
Obiect | dict |
Matrice | listă |
Şir | unicode |
număr - int | număr - int, lung |
număr - real | pluti |
Adevărat | Adevărat |
Fals | Fals |
Nul | Nici unul |
Să vedem un exemplu de bază de decodare în Python cu ajutorul funcției json.loads () ,
import json # json library imported# json data stringperson_data = '{ "person": { "name": "Kenn", "sex": "male", "age": 28}}'# Decoding or converting JSON format in dictionary using loads()dict_obj = json.loads(person_data)print(dict_obj)# check type of dict_objprint("Type of dict_obj", type(dict_obj))# get human object detailsprint("Person… ", dict_obj.get('person'))
Ieșire:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}Type of dict_objPerson… {'name': 'John', 'sex': 'male'}
Decodarea fișierului JSON sau analizarea fișierului JSON în Python
NOTĂ: Decodarea fișierului JSON este operațiunea de intrare / ieșire fișier (I / O). Fișierul JSON trebuie să existe pe sistemul dvs. la locația specificată pe care o menționați în programul dvs.
Exemplu,
import json#File I/O Open function for read data from JSON Filewith open('X:/json_file.json') as file_object:# store file data in objectdata = json.load(file_object)print(data)
Aici datele sunt un obiect de dicționar al Python.
Ieșire:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Codificare compactă în Python
Când trebuie să reduceți dimensiunea fișierului JSON, puteți utiliza codificarea compactă în Python.
Exemplu,
import json# Create a List that contains dictionarylst = ['a', 'b', 'c',{'4': 5, '6': 7}]# separator used for compact representation of JSON.# Use of ',' to identify list items# Use of ':' to identify key and value in dictionarycompact_obj = json.dumps(lst, separators=(',', ':'))print(compact_obj)
Ieșire:
'["a", "b", "c", {"4": 5, "6": 7}]'** Here output of JSON is represented in a single line which is the most compact representation by removing the space character from compact_obj **
Formatează codul JSON (Pretty print)
- Scopul este de a scrie un cod bine formatat pentru înțelegerea umană. Cu ajutorul imprimării frumoase, oricine poate înțelege cu ușurință codul.
- Exemplu,
import jsondic = { 'a': 4, 'b': 5 }''' To format the code use of indent and 4 shows number of space and use of separator is not necessary but standard way to write code of particular function. '''formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))print(formatted_obj)
Ieșire:
{"a" : 4,"b" : 5}
Pentru a înțelege mai bine acest lucru, schimbați liniuța la 40 și observați rezultatele
Comandarea codului JSON:
atributul sort_keys în argumentul funcției dumps () va sorta cheia în JSON în ordine crescătoare. Argumentul sort_keys este un atribut boolean. Când este adevărat, sortarea este permisă, altfel nu
Exemplu,
import jsonx = {"name": "Ken","age": 45,"married": True,"children": ("Alice", "Bob"),"pets": [ 'Dog' ],"cars": [{"model": "Audi A1", "mpg": 15.1},{"model": "Zeep Compass", "mpg": 18.1}],}# sorting result in asscending order by keys:sorted_string = json.dumps(x, indent=4, sort_keys=True)print(sorted_string)
Ieșire:
{"age": 45,"cars": [ {"model": "Audi A1","mpg": 15.1},{"model": "Zeep Compass","mpg": 18.1}],"children": [ "Alice","Bob"],"married": true,"name": "Ken","pets": ["Dog"]}
După cum puteți observa vârsta cheilor, mașinile, copiii etc. sunt aranjați în ordine crescătoare.
Codificarea obiectelor complexe a Python
Un obiect complex are două părți diferite, adică
- Partea reală
- Partea imaginară
Exemplu: 3 + 2i
Înainte de a efectua codificarea unui obiect complex, trebuie să verificați dacă o variabilă este complexă sau nu. Trebuie să creați o funcție care verifică valoarea stocată într-o variabilă utilizând o metodă de instanță.
Să creăm funcția specifică pentru ca obiectul de verificare să fie complex sau eligibil pentru codificare.
import json# create function to check instance is complex or notdef complex_encode(object):# check using isinstance methodif isinstance(object, complex):return [object.real, object.imag]# raised error using exception handling if object is not complexraise TypeError(repr(object) + " is not JSON serialized")# perform json encoding by passing parametercomplex_obj = json.dumps(4 + 5j, default=complex_encode)print(complex_obj)
Ieșire:
'[4.0, 5.0]'
Decodare obiect complex JSON în Python
Pentru a decoda obiectul complex în JSON, utilizați un parametru object_hook care verifică că șirul JSON conține sau nu obiectul complex. Exemplu,
import json# function check JSON string contains complex objectdef is_complex(objct):if '__complex__' in objct:return complex(objct['real'], objct['img'])return objct# use of json loads method with object_hook for check object complex or notcomplex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)#here we not passed complex object so it's convert into dictionarysimple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)print("Complex_object… ",complex_object)print("Without_complex_object… ",simple_object)
Ieșire:
Complex_object… (4+5j)Without_complex_object… {'real': 6, 'img': 7}
Prezentare generală a clasei de serializare JSON JSONEncoder
Clasa JSONEncoder este utilizată pentru serializarea oricărui obiect Python în timpul efectuării codării. Conține trei metode diferite de codificare care sunt
- implicit (o) - Implementat în subclasă și returnează serializarea obiectului pentru obiectul o .
- encode (o) - La fel ca metoda json.dumps () returnează șirul JSON al structurii de date Python.
- iterencode (o) - Reprezentați șirul unul câte unul și codificați obiectul o.
Cu ajutorul metodei encode () din clasa JSONEncoder, putem codifica și orice obiect Python.
# import JSONEncoder class from jsonfrom json.encoder import JSONEncodercolour_dict = { "colour": ["red", "yellow", "green" ]}# directly called encode method of JSONJSONEncoder().encode(colour_dict)
Ieșire:
'{"colour": ["red", "yellow", "green"]}'
Prezentare generală a clasei de deserializare JSON JSONDecoder
Clasa JSONDecoder este utilizată pentru deserializarea oricărui obiect Python în timpul efectuării decodării. Conține trei metode diferite de decodare care sunt
- implicit (o) - Implementat în subclasă și returnează obiectul deserializat o obiect.
- decode (o) - La fel ca metoda json.loads () returnează structura de date Python a șirului sau a datelor JSON.
- raw_decode (o) - Reprezentați dicționarul Python unul câte unul și decodați obiectul o.
Cu ajutorul metodei decode () a clasei JSONDecoder, putem decoda și șirul JSON.
import json# import JSONDecoder class from jsonfrom json.decoder import JSONDecodercolour_string = '{ "colour": ["red", "yellow"]}'# directly called decode method of JSONJSONDecoder().decode(colour_string)
Ieșire:
{'colour': ['red', 'yellow']}
Decodarea datelor JSON de la adresa URL: exemplu din viața reală
Vom prelua datele CityBike NYC (Bike Sharing System) de la adresa URL specificată (https://feeds.citibikenyc.com/stations/stations.json) și le vom converti în format de dicționar.
Exemplu,
NOTĂ: - Asigurați-vă că biblioteca de solicitări este deja instalată în Python, dacă nu, deschideți Terminal sau CMD și tastați
- (Pentru Python 3 sau mai sus) cererile de instalare pip3
import jsonimport requests# get JSON string data from CityBike NYC using web requests libraryjson_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")# check type of json_response objectprint(type(json_response.text))# load data in loads() function of json librarybike_dict = json.loads(json_response.text)#check type of news_dictprint(type(bike_dict))# now get stationBeanList key data from dictprint(bike_dict['stationBeanList'][0])
Ieșire:
{'id': 487,'stationName': 'E 20 St & FDR Drive','availableDocks': 24,'totalDocks': 34,'latitude': 40.73314259,'longitude': -73.97573881,'statusValue': 'In Service','statusKey': 1,'availableBikes': 9,'stAddress1': 'E 20 St & FDR Drive','stAddress2': '','city': '','postalCode': '','location': '','altitude': '','testStation': False,'lastCommunicationTime': '2018-12-11 10:59:09 PM', 'landMark': ''}
Excepții legate de biblioteca JSON din Python:
- Clasa json.JSONDecoderError gestionează excepția legată de operația de decodare. și este o subclasă de ValueError.
- Excepție - json.JSONDecoderError (msg, doc)
- Parametrii excepției sunt,
- msg - Mesaj de eroare neformatat
- doc - documente JSON analizate
- pos - pornește indexul docului când eșuează
- lineno - linia nu arată corespunde poz
- colon - coloana nu corespunde poz
Exemplu,
import json#File I/O Open function for read data from JSON Filedata = {} #Define Empty Dictionary Objecttry:with open('json_file_name.json') as file_object:data = json.load(file_object)except ValueError:print("Bad JSON file format, Change JSON File")
Numere Infinite și NaN în Python
JSON Data Interchange Format (RFC - Request for Comments) nu permite Infinite sau Nan Value, dar nu există nicio restricție în Python- JSON Library pentru a efectua operațiunea Infinite și Nan Value. Dacă JSON primește tipul de date INFINIT și Nan, atunci îl convertește în literal.
Exemplu,
import json# pass float Infinite valueinfinite_json = json.dumps(float('inf'))# check infinite json typeprint(infinite_json)print(type(infinite_json))json_nan = json.dumps(float('nan'))print(json_nan)# pass json_string as Infinityinfinite = json.loads('Infinity')print(infinite)# check type of Infinityprint(type(infinite))
Ieșire:
InfinityNaNinf
Cheie repetată în șirul JSON
RFC specifică că numele cheii trebuie să fie unic într-un obiect JSON, dar nu este obligatoriu. Biblioteca Python JSON nu creează o excepție a obiectelor repetate în JSON. Acesta ignoră toate perechile cheie-valoare repetate și ia în considerare doar ultima pereche cheie-valoare dintre ele.
- Exemplu,
import jsonrepeat_pair = '{"a": 1, "a": 2, "a": 3}'json.loads(repeat_pair)
Ieșire:
{'a': 3}
CLI (Command Line Interface) cu JSON în Python
json.tool oferă interfața liniei de comandă pentru a valida sintaxa JSON pretty-print. Să vedem un exemplu de CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Ieșire:
{"name": " Kings Authur "}
Avantajele JSON în Python
- Ușor de mutat înapoi între container și valoare (JSON la Python și Python la JSON)
- Obiect JSON lizibil de către om (Pretty-print)
- Utilizat pe scară largă în prelucrarea datelor.
- Nu are aceeași structură de date în fișierul unic.
Limitarea implementării JSON în Python
- În deserializator al gamei JSON și predicția unui număr
- Lungimea maximă a șirului JSON și a matricilor JSON și a nivelurilor de cuibărire ale obiectului.
Cod de trișare
json.dumps (person_data) |
Creați un obiect JSON |
json.dump (person_data, file_write) |
Creați fișier JSON utilizând fișierul I / O al Python |
compact_obj = json.dumps (date, separatori = (',', ':')) |
Compactați obiectul JSON prin eliminarea caracterului spațial din obiectul JSON folosind separatorul |
formatat_obj = json.dumps (dic, indentare = 4, separatori = (',', ':')) |
Formatarea codului JSON folosind indentare |
sorted_string = json.dumps (x, indent = 4, sort_keys = True) |
Sortarea cheii obiectului JSON după ordinea alfabetică |
complex_obj = json.dumps (4 + 5j, implicit = complex_encode) |
Codificare Python Complex Object în JSON |
JSONEncoder (). Codifica (color_dict) |
Utilizarea clasei JSONEncoder pentru serializare |
json.loads (data_string) |
Decodarea șirului JSON în dicționarul Python folosind funcția json.loads () |
json.loads ('{"__ complex__": adevărat, "real": 4, "img": 5}', object_hook = is_complex) |
Decodarea obiectului JSON complex către Python |
JSONDecoder (). Decodează (colour_string) |
Utilizarea decodării JSON către Python cu Deserializare |