JSON là gì?
JSON là một định dạng chuẩn để trao đổi dữ liệu, được lấy cảm hứng từ JavaScript. Nói chung, JSON ở định dạng chuỗi hoặc văn bản. JSON là viết tắt của J ava S cript O bject N otation.
Cú pháp của JSON: JSON được viết dưới dạng cặp khóa và giá trị.
{"Key": "Value","Key": "Value",}
JSON rất giống với từ điển Python. Python hỗ trợ JSON và nó có một thư viện sẵn có dưới dạng JSON.
Thư viện JSON bằng Python
Các mô-đun bên ngoài ' marshal ' và ' pickle' của Python duy trì một phiên bản của thư viện JSON . Để thực hiện các hoạt động liên quan đến JSON như mã hóa và giải mã bằng Python, trước tiên, bạn cần nhập thư viện JSON và cho thư viện đó trong tệp .py của bạn ,
import json
Các phương pháp sau có sẵn trong mô-đun JSON
phương pháp | Sự miêu tả |
---|---|
bãi () | mã hóa thành các đối tượng JSON |
đổ () | ghi chuỗi mã hóa trên tệp |
tải () | Giải mã chuỗi JSON |
tải () | Giải mã trong khi đọc tệp JSON |
Python sang JSON (Mã hóa)
Thư viện JSON của Python thực hiện dịch các đối tượng Python sau đây thành các đối tượng JSON theo mặc định
Python | JSON |
mệnh lệnh | Vật |
danh sách | Mảng |
unicode | Chuỗi |
number - int, long | số - int |
Phao nổi | số - thực |
Thật | Thật |
Sai | Sai |
không ai | Vô giá trị |
Chuyển đổi dữ liệu Python sang JSON được gọi là hoạt động Mã hóa. Mã hóa được thực hiện với sự trợ giúp của phương thức thư viện JSON - dumps ()
Phương thức dumps () chuyển đổi đối tượng từ điển của python thành định dạng dữ liệu chuỗi JSON.
Bây giờ chúng ta hãy thực hiện ví dụ mã hóa đầu tiên với 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)
Đầu ra:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Hãy tạo một tệp JSON của từ điển bằng cách sử dụng cùng một hàm kết xuất ()
# 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)
Đầu ra:
Không có gì để hiển thị
… Trong hệ thống của bạn, json_file.json đã được tạo, bạn có thể kiểm tra tệp đó.JSON sang Python (Giải mã)
Giải mã chuỗi JSON được thực hiện với sự trợ giúp của phương thức có sẵn load () & load () của thư viện JSON trong Python. Dưới đây bảng dịch hiển thị ví dụ về các đối tượng JSON sang các đối tượng Python, rất hữu ích để thực hiện giải mã chuỗi JSON bằng Python.
JSON | Python |
Vật | mệnh lệnh |
Mảng | danh sách |
Chuỗi | unicode |
số - int | number - int, long |
số - thực | Phao nổi |
Thật | Thật |
Sai | Sai |
Vô giá trị | không ai |
Hãy xem một ví dụ cơ bản về giải mã bằng Python với sự trợ giúp của hàm 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'))
Đầu ra:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}Type of dict_objPerson… {'name': 'John', 'sex': 'male'}
Giải mã tệp JSON hoặc phân tích cú pháp tệp JSON bằng Python
LƯU Ý: Giải mã tệp JSON là thao tác liên quan đến Đầu vào / Đầu ra (I / O) của tệp. Tệp JSON phải tồn tại trên hệ thống của bạn tại vị trí được chỉ định mà bạn đề cập trong chương trình của mình.
Thí dụ,
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)
Ở đây dữ liệu là một đối tượng từ điển của Python.
Đầu ra:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Mã hóa nhỏ gọn bằng Python
Khi bạn cần giảm kích thước tệp JSON của mình, bạn có thể sử dụng mã hóa nhỏ gọn bằng Python.
Thí dụ,
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)
Đầu ra:
'["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 **
Định dạng mã JSON (Bản in đẹp)
- Mục đích là viết mã có định dạng tốt để con người hiểu được. Với sự trợ giúp của việc in ấn đẹp, bất kỳ ai cũng có thể dễ dàng hiểu được mã.
- Thí dụ,
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)
Đầu ra:
{"a" : 4,"b" : 5}
Để hiểu rõ hơn điều này, hãy thay đổi thụt lề thành 40 và quan sát đầu ra-
Đặt hàng mã JSON:
Thuộc tính sort_keys trong đối số của hàm dumps () sẽ sắp xếp khóa trong JSON theo thứ tự tăng dần. Đối số sort_keys là một thuộc tính Boolean. Khi đúng thì phân loại được cho phép, ngược lại thì không
Thí dụ,
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)
Đầu ra:
{"age": 45,"cars": [ {"model": "Audi A1","mpg": 15.1},{"model": "Zeep Compass","mpg": 18.1}],"children": [ "Alice","Bob"],"married": true,"name": "Ken","pets": ["Dog"]}
Như bạn có thể quan sát thấy tuổi của chìa khóa, ô tô, trẻ em, v.v. được sắp xếp theo thứ tự tăng dần.
Mã hóa đối tượng phức tạp của Python
Một đối tượng phức tạp có hai phần khác nhau đó là
- Phần thực
- Phần tưởng tượng
Ví dụ: 3 + 2i
Trước khi thực hiện mã hóa một đối tượng phức tạp, bạn cần kiểm tra một biến có phức tạp hay không. Bạn cần tạo một hàm kiểm tra giá trị được lưu trữ trong một biến bằng cách sử dụng phương thức phiên bản.
Hãy tạo một hàm cụ thể cho đối tượng kiểm tra là phức tạp hoặc đủ điều kiện để mã hóa.
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)
Đầu ra:
'[4.0, 5.0]'
Giải mã đối tượng JSON phức tạp bằng Python
Để giải mã đối tượng phức tạp trong JSON, hãy sử dụng tham số object_hook để kiểm tra chuỗi JSON có chứa đối tượng phức tạp hay không. Thí dụ,
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)
Đầu ra:
Complex_object… (4+5j)Without_complex_object… {'real': 6, 'img': 7}
Tổng quan về JSON Serialization class JSONEncoder
Lớp JSONEncoder được sử dụng để tuần tự hóa bất kỳ đối tượng Python nào trong khi thực hiện mã hóa. Nó chứa ba phương pháp mã hóa khác nhau là
- default (o) - Thực hiện trong lớp con và trả về đối tượng tuần tự hóa cho đối tượng o .
- encode (o) - Tương tự như phương thức json.dumps () trả về chuỗi JSON của cấu trúc dữ liệu Python.
- iterencode (o) - Biểu diễn từng chuỗi một và mã hóa đối tượng o.
Với sự trợ giúp của phương thức encode () của lớp JSONEncoder, chúng ta cũng có thể mã hóa bất kỳ đối tượng Python nào.
# import JSONEncoder class from jsonfrom json.encoder import JSONEncodercolour_dict = { "colour": ["red", "yellow", "green" ]}# directly called encode method of JSONJSONEncoder().encode(colour_dict)
Đầu ra:
'{"colour": ["red", "yellow", "green"]}'
Tổng quan về JSON Deserialization class JSONDecoder
Lớp JSONDecoder được sử dụng để giải mã hóa bất kỳ đối tượng Python nào trong khi thực hiện giải mã. Nó chứa ba phương pháp giải mã khác nhau là
- default (o) - Thực hiện trong lớp con và trả về đối tượng o đối tượng deserialized .
- decode (o) - Tương tự như phương thức json.loads () trả về cấu trúc dữ liệu Python của chuỗi hoặc dữ liệu JSON.
- raw_decode (o) - Trình bày từng từ điển Python và giải mã đối tượng o.
Với sự trợ giúp của phương thức decode () của lớp JSONDecoder, chúng ta cũng có thể giải mã chuỗi 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)
Đầu ra:
{'colour': ['red', 'yellow']}
Giải mã dữ liệu JSON từ URL: Ví dụ về cuộc sống thực
Chúng tôi sẽ tìm nạp dữ liệu của CityBike NYC (Hệ thống chia sẻ xe đạp) từ URL được chỉ định (https://feeds.citibikenyc.com/stations/stations.json) và chuyển đổi sang định dạng từ điển.
Thí dụ,
LƯU Ý: - Đảm bảo thư viện yêu cầu đã được cài đặt trong Python của bạn, Nếu không, hãy mở Terminal hoặc CMD và nhập
- (Đối với Python 3 trở lên) yêu cầu cài đặt 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])
Đầu ra:
{'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': ''}
Các ngoại lệ liên quan đến Thư viện JSON bằng Python:
- Lớp json.JSONDecoderError xử lý ngoại lệ liên quan đến hoạt động giải mã. và nó là một lớp con của ValueError.
- Exception - json.JSONDecoderError (msg, doc)
- Các tham số của Exception là,
- msg - Thông báo lỗi chưa định dạng
- doc - tài liệu JSON được phân tích cú pháp
- pos - bắt đầu chỉ mục của doc khi nó bị lỗi
- lineno - dòng không hiển thị tương ứng với pos
- dấu hai chấm - cột không tương ứng với pos
Thí dụ,
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")
Số vô hạn và NaN trong Python
Định dạng trao đổi dữ liệu JSON (RFC - Request For Comments) không cho phép Giá trị vô hạn hoặc Nan nhưng không có hạn chế nào trong Thư viện Python- JSON để thực hiện thao tác liên quan đến Giá trị vô hạn và Nan. Nếu JSON nhận được kiểu dữ liệu INFINITE và Nan thì nó sẽ được chuyển đổi nó thành nghĩa đen.
Thí dụ,
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))
Đầu ra:
InfinityNaNinf
Khóa lặp lại trong chuỗi JSON
RFC chỉ định tên khóa phải là duy nhất trong một đối tượng JSON, nhưng nó không bắt buộc. Thư viện JSON của Python không nêu ra một ngoại lệ của các đối tượng lặp lại trong JSON. Nó bỏ qua tất cả các cặp khóa-giá trị lặp lại và chỉ xem xét cặp khóa-giá trị cuối cùng trong số chúng.
- Thí dụ,
import jsonrepeat_pair = '{"a": 1, "a": 2, "a": 3}'json.loads(repeat_pair)
Đầu ra:
{'a': 3}
CLI (Giao diện dòng lệnh) với JSON bằng Python
json.tool cung cấp giao diện dòng lệnh để xác thực cú pháp in đẹp JSON. Hãy xem một ví dụ về CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Đầu ra:
{"name": " Kings Authur "}
Ưu điểm của JSON trong Python
- Dễ dàng di chuyển trở lại giữa vùng chứa và giá trị (JSON sang Python và Python sang JSON)
- Đối tượng JSON có thể đọc được (Bản in đẹp) của con người
- Được sử dụng rộng rãi trong việc xử lý dữ liệu.
- Không có cùng cấu trúc dữ liệu trong một tệp.
Giới hạn triển khai của JSON trong Python
- Trong bộ giải mã dải JSON và dự đoán một số
- Độ dài tối đa của chuỗi JSON và mảng JSON và các cấp độ lồng nhau của đối tượng.
Mã gian lận
json.dumps (person_data) |
Tạo đối tượng JSON |
json.dump (user_data, file_write) |
Tạo tệp JSON bằng cách sử dụng tệp I / O của Python |
compact_obj = json.dumps (dữ liệu, dấu phân tách = (',', ':')) |
Thu gọn Đối tượng JSON bằng cách xóa ký tự khoảng trắng khỏi Đối tượng JSON bằng cách sử dụng dấu phân tách |
formatted_obj = json.dumps (dic, thụt lề = 4, dấu phân tách = (',', ':')) |
Định dạng mã JSON bằng cách sử dụng Thụt lề |
sorted_string = json.dumps (x, indent = 4, sort_keys = True) |
Sắp xếp khóa đối tượng JSON theo thứ tự bảng chữ cái |
complex_obj = json.dumps (4 + 5j, default = complex_encode) |
Mã hóa đối tượng phức hợp Python trong JSON |
JSONEncoder (). Encode (colour_dict) |
Sử dụng lớp JSONEncoder để tuần tự hóa |
json.loads (data_string) |
Giải mã chuỗi JSON trong từ điển Python bằng hàm json.loads () |
json.loads ('{"__ complex__": true, "real": 4, "img": 5}', object_hook = is_complex) |
Giải mã đối tượng JSON phức tạp sang Python |
JSONDecoder (). Decode (colour_string) |
Sử dụng giải mã JSON sang Python với Deserialization |