Co je JSON?
JSON je standardní formát pro výměnu dat, který je inspirován JavaScriptem. Obecně je JSON ve formátu řetězce nebo textu. JSON znamená J ava S cript O bject N otation.
Syntaxe JSON: JSON je zapsána jako pár klíčů a hodnot.
{"Key": "Value","Key": "Value",}
JSON je velmi podobný slovníku Pythonu. Python podporuje JSON a má vestavěnou knihovnu jako JSON.
Knihovna JSON v Pythonu
' maršál ' a ' nálev' externí moduly Pythonu udržují verzi knihovny JSON . Chcete-li provádět operace související s JSON, jako je kódování a dekódování v Pythonu, musíte nejprve importovat knihovnu JSON, a to do souboru .py ,
import json
V modulu JSON jsou k dispozici následující metody
Metoda | Popis |
---|---|
skládky () | kódování do objektů JSON |
výpis () | kódovaný řetězec zápisu do souboru |
zatížení () | Dekódujte řetězec JSON |
zatížení() | Dekódujte při čtení souboru JSON |
Python to JSON (kódování)
Knihovna JSON v Pythonu ve výchozím nastavení provádí následující překlad objektů Pythonu do objektů JSON
Krajta | JSON |
diktát | Objekt |
seznam | Pole |
unicode | Tětiva |
číslo - int, dlouhé | číslo - int |
plovák | číslo - skutečné |
Skutečný | Skutečný |
Nepravdivé | Nepravdivé |
Žádný | Nula |
Převod dat Pythonu na JSON se nazývá operace kódování. Kódování se provádí pomocí metody knihovny JSON - dumps ()
metoda dumps () převádí objekt slovníku pythonu do datového formátu řetězce JSON.
Nyní můžeme provést náš první příklad kódování pomocí Pythonu.
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)
Výstup:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Vytvořme soubor JSON slovníku pomocí stejné funkce 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)
Výstup:
Nic k vidění
… Ve vašem systému je vytvořen soubor json_file.json, který můžete zkontrolovat.JSON do Pythonu (dekódování)
Dekódování řetězec JSON se provádí pomocí vestavěné metody zatížení () a load () z JSON knihovny v Pythonu. Zde překladová tabulka ukazuje příklad objektů JSON na objekty Pythonu, které jsou užitečné při provádění dekódování v řetězci JSON v Pythonu.
JSON | Krajta |
Objekt | diktát |
Pole | seznam |
Tětiva | unicode |
číslo - int | číslo - int, dlouhé |
číslo - skutečné | plovák |
Skutečný | Skutečný |
Nepravdivé | Nepravdivé |
Nula | Žádný |
Podívejme se na základní příklad dekódování v Pythonu pomocí funkce 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'))
Výstup:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}Type of dict_objPerson… {'name': 'John', 'sex': 'male'}
Dekódování souboru JSON nebo analýza souboru JSON v Pythonu
POZNÁMKA: Dekódování souboru JSON je operace související se vstupem a výstupem souboru (I / O). Soubor JSON musí ve vašem systému existovat na zadaném místě, které zmiňujete ve svém programu.
Příklad,
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)
Zde jsou data slovníkovým objektem Pythonu.
Výstup:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Kompaktní kódování v Pythonu
Pokud potřebujete zmenšit velikost souboru JSON, můžete použít kompaktní kódování v Pythonu.
Příklad,
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)
Výstup:
'["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 **
Formátovat kód JSON (pěkný tisk)
- Cílem je napsat dobře naformátovaný kód pro lidské porozumění. S pomocí hezkého tisku může každý snadno pochopit kód.
- Příklad,
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)
Výstup:
{"a" : 4,"b" : 5}
Abyste tomu lépe porozuměli, změňte odsazení na 40 a sledujte výstup
Objednání kódu JSON:
Atribut sort_keys v argumentu funkce dumps () roztřídí klíč ve formátu JSON ve vzestupném pořadí. Argument sort_keys je booleovský atribut. Když je to pravda, třídění je povoleno, jinak ne
Příklad,
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)
Výstup:
{"age": 45,"cars": [ {"model": "Audi A1","mpg": 15.1},{"model": "Zeep Compass","mpg": 18.1}],"children": [ "Alice","Bob"],"married": true,"name": "Ken","pets": ["Dog"]}
Jak můžete sledovat věk klíčů, auta, děti atd. Jsou seřazeny vzestupně.
Komplexní kódování objektů Pythonu
Složitý objekt má dvě různé části
- Skutečná část
- Imaginární část
Příklad: 3 + 2i
Před provedením kódování složitého objektu musíte zkontrolovat, zda je proměnná složitá nebo ne. Musíte vytvořit funkci, která kontroluje hodnotu uloženou v proměnné pomocí metody instance.
Vytvořme specifickou funkci pro kontrolní objekt je složitý nebo vhodný pro kódování.
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)
Výstup:
'[4.0, 5.0]'
Složité dekódování objektů JSON v Pythonu
Chcete-li dekódovat složitý objekt v JSON, použijte parametr object_hook, který kontroluje, zda řetězec JSON obsahuje složitý objekt nebo ne. Příklad,
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)
Výstup:
Complex_object… (4+5j)Without_complex_object… {'real': 6, 'img': 7}
Přehled třídy JSON Serialization JSONEncoder
Třída JSONEncoder se používá pro serializaci libovolného objektu Pythonu při provádění kódování. Obsahuje tři různé způsoby kódování, které jsou
- default (o) - Implementováno v podtřídě a vrátit serializovaný objekt pro o objekt.
- encode (o) - Stejné jako metoda json.dumps () vrací řetězec JSON datové struktury Pythonu.
- iterencode (o) - představuje řetězec jeden po druhém a kóduje objekt o.
Pomocí metody encode () třídy JSONEncoder můžeme také kódovat jakýkoli objekt Pythonu.
# import JSONEncoder class from jsonfrom json.encoder import JSONEncodercolour_dict = { "colour": ["red", "yellow", "green" ]}# directly called encode method of JSONJSONEncoder().encode(colour_dict)
Výstup:
'{"colour": ["red", "yellow", "green"]}'
Přehled třídy desonializace JSON JSONDecoder
Třída JSONDecoder se používá pro deserializaci libovolného objektu Pythonu při provádění dekódování. Obsahuje tři různé způsoby dekódování, které jsou
- default (o) - Implementováno v podtřídě a vrátit deserializovaný objekt o objekt.
- decode (o) - Stejné jako metoda json.loads () vrací datovou strukturu Pythonu řetězce JSON nebo dat.
- raw_decode (o) - reprezentuje jeden po druhém slovník Pythonu a dekóduje objekt o.
Pomocí metody decode () třídy JSONDecoder můžeme také dekódovat řetězec 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)
Výstup:
{'colour': ['red', 'yellow']}
Dekódování dat JSON z URL: Příklad z reálného života
Načteme data CityBike NYC (Bike Sharing System) ze zadané adresy URL (https://feeds.citibikenyc.com/stations/stations.json) a převedeme do formátu slovníku.
Příklad,
POZNÁMKA: - Ujistěte se, že knihovna požadavků je ve vašem Pythonu již nainstalována. Pokud ne, otevřete terminál nebo CMD a zadejte
- (Pro Python 3 nebo vyšší) požadavky na instalaci 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])
Výstup:
{'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': ''}
Výjimky související s knihovnou JSON v Pythonu:
- Třída json.JSONDecoderError zpracovává výjimku související s operací dekódování. a je to podtřída ValueError.
- Výjimka - json.JSONDecoderError (msg, doc)
- Parametry výjimky jsou,
- msg - Neformátovaná chybová zpráva
- doc - analyzovány dokumenty JSON
- pos - spustit index dokumentu, když selhal
- lineno - řádek žádné výstavy odpovídají poz
- dvojtečka - sloupec neodpovídá poz
Příklad,
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")
Nekonečná a NaN čísla v Pythonu
Formát JSON Data Interchange Format (RFC - žádost o komentáře) neumožňuje nekonečnou nebo nanovou hodnotu, ale v knihovně Python-JSON není žádné omezení k provádění operací souvisejících s nekonečnou a nanovou hodnotou. Pokud JSON získá datový typ INFINITE a Nan, převede jej na doslovný.
Příklad,
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))
Výstup:
InfinityNaNinf
Opakovaný klíč v řetězci JSON
RFC určuje, že název klíče by měl být v objektu JSON jedinečný, ale není to povinné. Knihovna JSON v Pythonu nevyvolává výjimku opakovaných objektů v JSON. Ignoruje všechny opakované páry klíč – hodnota a zvažuje mezi nimi pouze poslední pár klíč – hodnota.
- Příklad,
import jsonrepeat_pair = '{"a": 1, "a": 2, "a": 3}'json.loads(repeat_pair)
Výstup:
{'a': 3}
CLI (rozhraní příkazového řádku) s JSON v Pythonu
json.tool poskytuje rozhraní příkazového řádku k ověření syntaxe JSON pretty-print. Podívejme se na příklad CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Výstup:
{"name": " Kings Authur "}
Výhody JSON v Pythonu
- Snadný přesun zpět mezi kontejnerem a hodnotou (JSON pro Python a Python pro JSON)
- Lidsky čitelný (hezký tisk) objekt JSON
- Široce se používá při zpracování dat.
- Nemá stejnou datovou strukturu v jediném souboru.
Omezení implementace JSON v Pythonu
- V deserializátoru rozsahu JSON a predikci čísla
- Maximální délka řetězce JSON a pole JSON a úrovně vnoření objektu.
Podvádět kód
json.dumps (person_data) |
Vytvořte objekt JSON |
json.dump (person_data, file_write) |
Vytvořte soubor JSON pomocí File I / O v Pythonu |
compact_obj = json.dumps (data, separators = (',', ':')) |
Kompaktní objekt JSON odstraněním znaku mezery z objektu JSON pomocí oddělovače |
formatted_obj = json.dumps (dic, indent = 4, separators = (',', ':')) |
Formátování kódu JSON pomocí odsazení |
tříděný_řetězec = json.dumps (x, odsazení = 4, sort_keys = True) |
Třídění klíče objektu JSON podle abecedního pořadí |
complex_obj = json.dumps (4 + 5j, výchozí = komplexní_kód) |
Kódování komplexních objektů Python v JSON |
JSONEncoder (). Encode (colour_dict) |
Použití třídy JSONEncoder pro serializaci |
json.loads (datový_řetězec) |
Dekódování řetězce JSON ve slovníku Pythonu pomocí funkce json.loads () |
json.loads ('{"__ complex__": true, "real": 4, "img": 5}', object_hook = is_complex) |
Dekódování komplexního objektu JSON do Pythonu |
JSONDecoder (). Decode (color_string) |
Použití dekódování JSON na Python s deserializací |