Apa itu JSON?
JSON adalah format standard untuk pertukaran data, yang diilhamkan oleh JavaScript. Secara amnya, JSON dalam format rentetan atau teks. JSON bermaksud J ava S cript O bject N otation.
Sintaks JSON: JSON ditulis sebagai pasangan kunci dan nilai.
{"Key": "Value","Key": "Value",}
JSON sangat serupa dengan kamus Python. Python menyokong JSON, dan ia mempunyai perpustakaan terbina dalam sebagai JSON.
Perpustakaan JSON di Python
Modul luaran ' marshal ' dan ' pickle' Python mengekalkan versi perpustakaan JSON . Untuk menjalankan operasi berkaitan JSON seperti pengekodan dan penyahkodan di Python, anda perlu terlebih dahulu mengimport perpustakaan JSON dan untuk itu dalam fail .py anda
import json
Kaedah berikut terdapat dalam modul JSON
Kaedah | Penerangan |
---|---|
lambakan () | pengekodan ke objek JSON |
pembuangan() | penulisan rentetan yang dikodkan pada fail |
muatan () | Nyahkod rentetan JSON |
beban () | Nyahkod semasa fail JSON dibaca |
Python ke JSON (Pengekodan)
JSON Library of Python melakukan terjemahan berikut objek Python ke objek JSON secara lalai
Python | JSON |
imlak | Objek |
senarai | Array |
unikod | Tali |
nombor - int, panjang | nombor - int |
terapung | nombor - nyata |
Betul | Betul |
Salah | Salah |
Tiada | Batal |
Menukar data Python ke JSON disebut operasi Pengekodan. Pengekodan dilakukan dengan bantuan kaedah perpustakaan JSON - dumps ()
kaedah dumps () menukar objek kamus python menjadi format data rentetan JSON.
Sekarang mari kita lakukan contoh pengekodan pertama kita dengan 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)
Pengeluaran:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Mari buat fail JSON kamus menggunakan lambakan fungsi yang sama ()
# 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)
Pengeluaran:
Tidak ada yang ditunjukkan
… Dalam sistem anda json_file.json dibuat anda boleh menyemak fail itu.JSON ke Python (Penyahkodan)
Penyahkodan rentetan JSON dilakukan dengan bantuan beban kaedah inbuilt () & load () perpustakaan JSON di Python. Di sini jadual terjemahan menunjukkan contoh objek JSON ke objek Python yang berguna untuk melakukan penyahkodan dalam rentetan Python JSON.
JSON | Python |
Objek | imlak |
Array | senarai |
Tali | unikod |
nombor - int | nombor - int, panjang |
nombor - nyata | terapung |
Betul | Betul |
Salah | Salah |
Batal | Tiada |
Mari kita lihat contoh asas penyahkodan di Python dengan bantuan fungsi 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'))
Pengeluaran:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}Type of dict_objPerson… {'name': 'John', 'sex': 'male'}
Mendekodkan Fail JSON atau Menghuraikan fail JSON di Python
CATATAN: Penyahkodan fail JSON adalah operasi berkaitan Input / Output Fail (I / O). Fail JSON mesti ada di sistem anda di lokasi yang ditentukan yang anda sebutkan dalam program anda.
Contohnya,
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)
Di sini data adalah objek kamus Python.
Pengeluaran:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Pengekodan Ringkas di Python
Apabila anda perlu mengurangkan saiz fail JSON anda, anda boleh menggunakan pengekodan ringkas di Python.
Contohnya,
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)
Pengeluaran:
'["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 **
Format kod JSON (Cetakan cantik)
- Tujuannya adalah untuk menulis kod berformat baik untuk pemahaman manusia. Dengan bantuan percetakan yang cantik, sesiapa sahaja dapat memahami kodnya dengan mudah.
- Contohnya,
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)
Pengeluaran:
{"a" : 4,"b" : 5}
Untuk lebih memahami perkara ini, ubah inden menjadi 40 dan perhatikan output-
Memesan kod JSON:
atribut sort_keys dalam dumps () argumen fungsi akan menyusun kunci dalam JSON dalam urutan menaik. Argumen sort_keys adalah atribut Boolean. Bila betul penyortiran dibenarkan sebaliknya tidak
Contohnya,
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)
Pengeluaran:
{"age": 45,"cars": [ {"model": "Audi A1","mpg": 15.1},{"model": "Zeep Compass","mpg": 18.1}],"children": [ "Alice","Bob"],"married": true,"name": "Ken","pets": ["Dog"]}
Seperti yang anda perhatikan usia kunci, kereta, anak-anak, dan lain-lain disusun mengikut urutan menaik.
Pengekodan Objek Kompleks Python
Objek Kompleks mempunyai dua bahagian berbeza iaitu
- Bahagian sebenar
- Bahagian khayalan
Contoh: 3 + 2i
Sebelum melakukan pengekodan objek kompleks, anda perlu memeriksa pemboleh ubah yang kompleks atau tidak. Anda perlu membuat fungsi yang memeriksa nilai yang tersimpan dalam pemboleh ubah dengan menggunakan kaedah contoh.
Mari buat fungsi khusus untuk memeriksa objek yang kompleks atau layak untuk pengekodan.
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)
Pengeluaran:
'[4.0, 5.0]'
Penyahkodan objek JSON kompleks di Python
Untuk menyahkod objek kompleks dalam JSON, gunakan parameter object_hook yang memeriksa rentetan JSON mengandungi objek kompleks atau tidak. Contohnya,
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)
Pengeluaran:
Complex_object… (4+5j)Without_complex_object… {'real': 6, 'img': 7}
Gambaran keseluruhan JSON Serialization class JSONEncoder
Kelas JSONEncoder digunakan untuk serialisasi mana-mana objek Python semasa melakukan pengekodan. Ia mengandungi tiga kaedah pengekodan yang berbeza iaitu
- lalai (o) - Dilaksanakan dalam subkelas dan mengembalikan objek bersiri untuk objek o .
- encode (o) - Sama seperti kaedah json.dumps () mengembalikan rentetan JSON struktur data Python.
- iterencode (o) - Mewakili rentetan satu persatu dan mengekod objek o.
Dengan bantuan kaedah encode () kelas JSONEncoder, kita juga dapat mengekodkan sebarang objek Python.
# import JSONEncoder class from jsonfrom json.encoder import JSONEncodercolour_dict = { "colour": ["red", "yellow", "green" ]}# directly called encode method of JSONJSONEncoder().encode(colour_dict)
Pengeluaran:
'{"colour": ["red", "yellow", "green"]}'
Gambaran keseluruhan kelas JSON Deserialization JSONDecoder
Kelas JSONDecoder digunakan untuk deserialisasi mana-mana objek Python semasa melakukan penyahkodan. Ia mengandungi tiga kaedah penyahkodan yang berbeza iaitu
- lalai (o) - Dilaksanakan dalam subclass dan mengembalikan objek o deserialized objek.
- decode (o) - Sama seperti kaedah json.loads () mengembalikan struktur data Python rentetan atau data JSON.
- raw_decode (o) - Mewakili kamus Python satu persatu dan menyahkod objek o.
Dengan bantuan kaedah decode () kelas JSONDecoder, kita juga dapat menyahkod rentetan 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)
Pengeluaran:
{'colour': ['red', 'yellow']}
Menyahkod data JSON dari URL: Contoh Kehidupan Sebenar
Kami akan mengambil data CityBike NYC (Bike Sharing System) dari URL yang ditentukan (https://feeds.citibikenyc.com/stations/stations.json) dan menukar menjadi format kamus.
Contohnya,
CATATAN: - Pastikan pustaka permintaan sudah dipasang di Python anda, Jika tidak maka buka Terminal atau CMD dan taip
- (Untuk Python 3 atau lebih tinggi) permintaan pemasangan 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])
Pengeluaran:
{'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': ''}
Pengecualian Berkaitan dengan Perpustakaan JSON di Python:
- Class json.JSONDecoderError menangani pengecualian yang berkaitan dengan operasi penyahkodan. dan itu adalah subkelas ValueError.
- Pengecualian - json.JSONDecoderError (msg, doc)
- Parameter Pengecualian adalah,
- msg - Mesej Ralat Tidak Berformat
- doc - dokumen JSON dihuraikan
- pos - mula indeks dokumen apabila gagal
- lineno - garis tidak menunjukkan sesuai dengan pos
- kolon - lajur tidak sesuai dengan pos
Contohnya,
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")
Nombor Tidak Terbatas dan NaN di Python
Format Pertukaran Data JSON (RFC - Request For Comments) tidak membenarkan Nilai Infinite atau Nan tetapi tidak ada batasan di Python- JSON Library untuk melakukan operasi yang berkaitan dengan Infinite dan Nilai Nan. Sekiranya JSON mendapat jenis data INFINITE dan Nan daripada ia ditukarkan menjadi literal.
Contohnya,
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))
Pengeluaran:
InfinityNaNinf
Kekunci berulang dalam JSON String
RFC menentukan nama kunci harus unik dalam objek JSON, tetapi tidak wajib. Perpustakaan Python JSON tidak menimbulkan pengecualian objek berulang di JSON. Ia mengabaikan semua pasangan kunci-nilai berulang dan hanya menganggap pasangan kunci-nilai terakhir di antara mereka.
- Contohnya,
import jsonrepeat_pair = '{"a": 1, "a": 2, "a": 3}'json.loads(repeat_pair)
Pengeluaran:
{'a': 3}
CLI (Interface Line Command) dengan JSON di Python
json.tool menyediakan antara muka baris perintah untuk mengesahkan sintaks cetak JSON. Mari lihat contoh CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Pengeluaran:
{"name": " Kings Authur "}
Kelebihan JSON di Python
- Mudah bergerak kembali antara bekas dan nilai (JSON ke Python dan Python ke JSON)
- Objek JSON yang boleh dibaca oleh manusia (Pretty-print)
- Digunakan secara meluas dalam pengendalian data.
- Tidak mempunyai struktur data yang sama dalam satu fail.
Batasan pelaksanaan JSON di Python
- Dalam deserializer julat JSON dan ramalan nombor
- Panjang maksimum rentetan JSON dan tatasusunan JSON dan tahap objek bersarang.
Kod Menipu
json.dumps (orang_data) |
Buat Objek JSON |
json.dump (person_data, file_write) |
Buat Fail JSON menggunakan Fail I / O Python |
compact_obj = json.dumps (data, pemisah = (',', ':')) |
Objek JSON padat dengan membuang watak ruang dari Objek JSON menggunakan pemisah |
diformat_obj = json.dumps (dic, indent = 4, separators = (',', ':')) |
Memformat kod JSON menggunakan Inden |
diurutkan_string = json.dumps (x, indent = 4, sort_keys = True) |
Menyusun kekunci objek JSON mengikut urutan abjad |
complex_obj = json.dumps (4 + 5j, default = complex_encode) |
Pengekodan Objek Kompleks Python di JSON |
JSONEncoder (). Encode (colour_dict) |
Penggunaan Kelas JSONEncoder untuk Serialisasi |
json.loads (data_string) |
Menyahkod JSON String dalam kamus Python menggunakan fungsi json.loads () |
json.loads ('{"__ complex__": true, "real": 4, "img": 5}', object_hook = is_complex) |
Penyahkodan objek JSON kompleks kepada Python |
JSONDecoder (). Decode (warna_string) |
Penggunaan Decoding JSON ke Python dengan Deserialization |