Co to jest JSON?
JSON to standardowy format wymiany danych, który jest inspirowany JavaScriptem. Ogólnie rzecz biorąc, JSON jest w formacie ciągowym lub tekstowym. JSON oznacza J Ava S CRIPT O bject N otation.
Składnia JSON: JSON jest zapisywana jako para klucz i wartość.
{"Key": "Value","Key": "Value",}
JSON jest bardzo podobny do słownika Pythona. Python obsługuje JSON i ma wbudowaną bibliotekę jako JSON.
Biblioteka JSON w Pythonie
Zewnętrzne moduły Pythona „ marshal ” i „ pickle” utrzymują wersję biblioteki JSON . Aby wykonać operacje związane z JSON, takie jak kodowanie i dekodowanie w Pythonie, musisz najpierw zaimportować bibliotekę JSON, a do tego w swoim pliku .py ,
import json
W module JSON dostępne są następujące metody
metoda | Opis |
---|---|
depresja() | kodowanie do obiektów JSON |
wysypisko() | zapis zakodowanego ciągu znaków do pliku |
masa() | Zdekoduj ciąg JSON |
Załaduj() | Dekoduj podczas odczytu pliku JSON |
Python na JSON (kodowanie)
JSON Library of Python domyślnie wykonuje następujące tłumaczenie obiektów Pythona na obiekty JSON
Pyton | JSON |
dykt | Obiekt |
lista | Szyk |
Unicode | Strunowy |
liczba - int, long | liczba - wew |
pływak | liczba - rzeczywista |
Prawdziwe | Prawdziwe |
Fałszywy | Fałszywy |
Żaden | Zero |
Konwersja danych Pythona do formatu JSON jest nazywana operacją kodowania. Kodowanie odbywa się za pomocą metody biblioteki JSON - dumps ()
dumps () konwertuje obiekt słownika języka Python na format danych tekstowych JSON.
Teraz przeprowadźmy nasz pierwszy przykład kodowania w Pythonie.
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)
Wynik:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Stwórzmy plik JSON słownika używając tej samej funkcji 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)
Wynik:
Nic do pokazania
… W Twoim systemie tworzony jest plik json_file.json, możesz sprawdzić ten plik.JSON na Python (dekodowanie)
JSON dekodowania ciąg odbywa się za pomocą metody wbudowane ładunku () i load () z biblioteki JSON w Pythonie. Tutaj tabela translacji pokazuje przykład obiektów JSON do obiektów Pythona, które są pomocne przy dekodowaniu w Pythonie łańcucha JSON.
JSON | Pyton |
Obiekt | dykt |
Szyk | lista |
Strunowy | Unicode |
liczba - wew | liczba - int, long |
liczba - rzeczywista | pływak |
Prawdziwe | Prawdziwe |
Fałszywy | Fałszywy |
Zero | Żaden |
Zobaczmy podstawowy przykład dekodowania w Pythonie za pomocą funkcji 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'))
Wynik:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}Type of dict_objPerson… {'name': 'John', 'sex': 'male'}
Dekodowanie pliku JSON lub analiza pliku JSON w Pythonie
UWAGA: Dekodowanie pliku JSON jest operacją związaną z wejściem / wyjściem (I / O) pliku. Plik JSON musi istnieć w systemie w określonej lokalizacji podanej w programie.
Przykład,
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)
Tutaj dane są obiektem słownikowym Pythona.
Wynik:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Kompaktowe kodowanie w Pythonie
Kiedy chcesz zmniejszyć rozmiar pliku JSON, możesz użyć kompaktowego kodowania w Pythonie.
Przykład,
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)
Wynik:
'["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 **
Sformatuj kod JSON (ładny wydruk)
- Celem jest napisanie dobrze sformatowanego kodu do zrozumienia przez ludzi. Dzięki ładnemu drukowaniu każdy może łatwo zrozumieć kod.
- Przykład,
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)
Wynik:
{"a" : 4,"b" : 5}
Aby lepiej to zrozumieć, zmień wcięcie na 40 i obserwuj wynik
Zamawianie kodu JSON:
Atrybut sort_keys w argumencie funkcji dumps () posortuje klucz w formacie JSON w porządku rosnącym. Argument sort_keys jest atrybutem logicznym. Jeśli to prawda, sortowanie jest dozwolone, w przeciwnym razie nie
Przykład,
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)
Wynik:
{"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 widać wiek kluczy, samochody, dzieci itp. Są ułożone w kolejności rosnącej.
Złożone kodowanie obiektów w Pythonie
To znaczy obiekt złożony składa się z dwóch różnych części
- Prawdziwa część
- Część urojona
Przykład: 3 + 2i
Przed wykonaniem kodowania złożonego obiektu należy sprawdzić, czy zmienna jest złożona, czy nie. Musisz utworzyć funkcję, która sprawdza wartość przechowywaną w zmiennej przy użyciu metody instancji.
Stwórzmy konkretną funkcję dla obiektu check, który jest złożony lub kwalifikuje się do kodowania.
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)
Wynik:
'[4.0, 5.0]'
Złożone dekodowanie obiektów JSON w Pythonie
Aby zdekodować obiekt złożony w formacie JSON, użyj parametru object_hook, który sprawdza, czy ciąg JSON zawiera obiekt złożony, czy nie. Przykład,
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)
Wynik:
Complex_object… (4+5j)Without_complex_object… {'real': 6, 'img': 7}
Omówienie klasy serializacji JSON JSONEncoder
Klasa JSONEncoder służy do serializacji dowolnego obiektu Pythona podczas kodowania. Zawiera trzy różne metody kodowania, które są
- default (o) - Zaimplementowany w podklasie i zwraca obiekt serializacji dla obiektu o .
- encode (o) - tak samo jak metoda json.dumps () zwraca ciąg JSON struktury danych Pythona.
- iterencode (o) - reprezentuje ciąg jeden po drugim i koduje obiekt o.
Za pomocą metody encode () klasy JSONEncoder możemy również zakodować dowolny obiekt Pythona.
# import JSONEncoder class from jsonfrom json.encoder import JSONEncodercolour_dict = { "colour": ["red", "yellow", "green" ]}# directly called encode method of JSONJSONEncoder().encode(colour_dict)
Wynik:
'{"colour": ["red", "yellow", "green"]}'
Omówienie klasy deserializacji JSON JSONDecoder
Klasa JSONDecoder służy do deserializacji dowolnego obiektu Pythona podczas dekodowania. Zawiera trzy różne metody dekodowania, które są
- default (o) - Zaimplementowany w podklasie i zwraca zdeserializowany obiekt o obiekt.
- decode (o) - to samo, co metoda json.loads () zwraca strukturę danych Pythona w postaci ciągu lub danych JSON.
- raw_decode (o) - Reprezentuj słownik Pythona jeden po drugim i dekoduj obiekt o.
Za pomocą metody decode () klasy JSONDecoder możemy również zdekodować ciąg 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)
Wynik:
{'colour': ['red', 'yellow']}
Dekodowanie danych JSON z adresu URL: Przykład z życia wzięty
Będziemy pobierać dane CityBike NYC (Bike Sharing System) z określonego adresu URL (https://feeds.citibikenyc.com/stations/stations.json) i konwertować do formatu słownika.
Przykład,
UWAGA: - Upewnij się, że biblioteka żądań jest już zainstalowana w twoim Pythonie, jeśli nie, otwórz Terminal lub CMD i wpisz
- (W przypadku języka Python 3 lub nowszego ) żądania instalacji 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])
Wynik:
{'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': ''}
Wyjątki związane z biblioteką JSON w Pythonie:
- Klasa json.JSONDecoderError obsługuje wyjątek związany z operacją dekodowania. i jest to podklasa ValueError.
- Wyjątek - json.JSONDecoderError (msg, doc)
- Parametry wyjątku to:
- msg - Niesformatowany komunikat o błędzie
- doc - przeanalizowano dokumenty JSON
- pos - uruchamia indeks dokumentu, gdy się nie powiedzie
- lineno - linia brak pokazów odpowiada poz
- dwukropek - kolumna nie odpowiada poz
Przykład,
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")
Numery nieskończone i NaN w Pythonie
Format wymiany danych JSON (RFC - Request For Comments) nie zezwala na Infinite lub Nan Value, ale nie ma ograniczeń w Python-JSON Library do wykonywania operacji związanych z Infinite i Nan Value. Jeśli JSON otrzyma typ danych INFINITE i Nan, to przekształci go w literał.
Przykład,
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))
Wynik:
InfinityNaNinf
Powtórzony klucz w ciągu JSON
RFC określa, że nazwa klucza powinna być unikalna w obiekcie JSON, ale nie jest to obowiązkowe. Biblioteka Python JSON nie zgłasza wyjątku powtarzających się obiektów w formacie JSON. Ignoruje wszystkie powtarzające się pary klucz-wartość i bierze pod uwagę tylko ostatnią spośród nich parę klucz-wartość.
- Przykład,
import jsonrepeat_pair = '{"a": 1, "a": 2, "a": 3}'json.loads(repeat_pair)
Wynik:
{'a': 3}
CLI (interfejs wiersza poleceń) z JSON w Pythonie
json.tool zapewnia interfejs wiersza poleceń do sprawdzania poprawnej składni JSON. Zobaczmy przykład CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Wynik:
{"name": " Kings Authur "}
Zalety JSON w Pythonie
- Łatwe przechodzenie między kontenerem a wartością (JSON do Python i Python do JSON)
- Czytelny dla człowieka (ładny wydruk) obiekt JSON
- Szeroko stosowany w przetwarzaniu danych.
- Nie ma takiej samej struktury danych w jednym pliku.
Ograniczenie implementacji JSON w Pythonie
- W deserializatorze zakresu JSON i przewidywaniu liczby
- Maksymalna długość ciągu JSON i tablic JSON oraz poziomów zagnieżdżenia obiektu.
Cheat Code
json.dumps (person_data) |
Utwórz obiekt JSON |
json.dump (person_data, plik_write) |
Utwórz plik JSON przy użyciu funkcji We / Wy pliku w języku Python |
compact_obj = json.dumps (dane, separatory = (',', ':')) |
Kompaktuj obiekt JSON, usuwając znak spacji z obiektu JSON za pomocą separatora |
formatted_obj = json.dumps (dic, indent = 4, separators = (',', ':')) |
Formatowanie kodu JSON przy użyciu wcięcia |
sort_string = json.dumps (x, indent = 4, sort_keys = True) |
Sortowanie klucza obiektu JSON według kolejności alfabetycznej |
complex_obj = json.dumps (4 + 5j, default = complex_encode) |
Kodowanie obiektów złożonych w języku Python w formacie JSON |
JSONEncoder (). Encode (colour_dict) |
Użycie klasy JSONEncoder do serializacji |
json.loads (ciąg_danych) |
Dekodowanie ciągu JSON w słowniku Pythona przy użyciu funkcji json.loads () |
json.loads ('{"__ complex__": true, "real": 4, "img": 5}', object_hook = is_complex) |
Dekodowanie złożonego obiektu JSON do Pythona |
JSONDecoder (). Decode (colour_string) |
Wykorzystanie dekodowania JSON do Pythona z deserializacją |