Python JSON: kodowanie (zrzut), dekodowanie (ładowanie) danych json & Plik (przykład)

Spisie treści:

Anonim

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_obj Person… {'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

  1. Prawdziwa część
  2. 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ą