JSON là viết tắt của JavaScript Object Notation. Đây là định dạng trao đổi dữ liệu nhẹ. Nó tương tự như pickle. Tuy nhiên, serialization của pickle dành riêng cho Python trong khi định dạng JSON được triển khai bởi nhiều ngôn ngữ. Module json trong thư viện chuẩn của Python triển khai chức năng serialization đối tượng tương tự như các module pickle và marshal.
Giống như module pickle, module json cũng cung cấp các hàm dumps() và loads() để serialization đối tượng Python thành chuỗi được mã hóa JSON, và các hàm dump() và load() ghi và đọc đối tượng Python đã serialize từ/vào tệp.
Hàm dumps()
Hàm này chuyển đổi đối tượng thành định dạng JSON.
Hàm loads()
Hàm này chuyển đổi chuỗi JSON trở lại đối tượng Python.
Ví dụ sau minh họa cách sử dụng cơ bản của các hàm này:
>>> import json
>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> s = json.dumps(data)
>>> s
'["Rakesh", {"marks": [50, 60, 70]}]'
>>> json.loads(s)
['Rakesh', {'marks': [50, 60, 70]}]
Hàm dumps() có thể nhận tham số tùy chọn sort_keys. Mặc định là False. Nếu đặt thành True, các khóa từ điển xuất hiện theo thứ tự đã sắp xếp trong chuỗi JSON.
>>> data = {"marks": 50, "age": 20, "rank": 5}
>>> s = json.dumps(data, sort_keys=True)
>>> s
'{"age": 20, "marks": 50, "rank": 5}'
>>> json.loads(s)
{'age': 20, 'marks': 50, 'rank': 5}
Hàm dumps() có tham số tùy chọn khác gọi là indent nhận một số làm giá trị. Nó quyết định độ dài của từng đoạn trong biểu diễn định dạng của chuỗi json, tương tự như đầu ra của pprint.
>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> s = json.dumps(data, indent=2)
>>> print(s)
[
"Rakesh",
{
"marks": [
50,
60,
70
]
}
]
Module json cũng có API hướng đối tượng tương ứng với các hàm trên. Có hai lớp được định nghĩa trong module – JSONEncoder và JSONDecoder.
Lớp JSONEncoder
Đối tượng của lớp này là bộ mã hóa cho các cấu trúc dữ liệu Python. Mỗi kiểu dữ liệu Python được chuyển đổi thành kiểu JSON tương ứng như trong bảng sau:
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, float, int- & float-derived Enums | number |
| True | true |
| False | false |
| None | null |
Lớp JSONEncoder được khởi tạo bởi constructor JSONEncoder(). Các phương thức quan trọng được định nghĩa trong lớp encoder:
encode() − serialize đối tượng Python thành định dạng JSON
iterencode() − Mã hóa đối tượng và trả về một iterator tạo ra dạng mã hóa của từng mục trong đối tượng.
indent − Xác định mức thụt lề của chuỗi được mã hóa
sort_keys − là true hoặc false để các khóa xuất hiện theo thứ tự sắp xếp hay không.
check_circular − nếu True, kiểm tra tham chiếu vòng tròn trong đối tượng kiểu container
Ví dụ sau mã hóa đối tượng danh sách Python:
>>> e = json.JSONEncoder()
>>> e.encode(data)
'["Rakesh", {"marks": [50, 60, 70]}]'
Sử dụng phương thức iterencode(), từng phần của chuỗi được mã hóa hiển thị như sau:
>>> for obj in e.iterencode(data):
... print(obj)
[
"Rakesh"
{
"marks"
:
[
50
, 60
, 70
]
}
]
Lớp JSONDecoder
Đối tượng của lớp này giúp giải mã chuỗi json trở lại cấu trúc dữ liệu Python. Phương thức chính trong lớp này là decode(). Đoạn mã ví dụ sau truy xuất đối tượng danh sách Python từ chuỗi được mã hóa ở bước trước:
>>> d = json.JSONDecoder()
>>> d.decode(s)
['Rakesh', {'marks': [50, 60, 70]}]
JSON với tệp/luồng
Module json định nghĩa các hàm load() và dump() để ghi dữ liệu JSON vào một đối tượng giống tệp – có thể là tệp đĩa hoặc luồng byte và đọc dữ liệu trở lại từ chúng.
Hàm dump()
Hàm này mã hóa dữ liệu đối tượng Python thành định dạng JSON và ghi nó vào một tệp. Tệp phải có quyền ghi.
>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> fp = open('json.txt', 'w')
>>> json.dump(data, fp)
>>> fp.close()
Mã này sẽ tạo json.txt trong thư mục hiện tại. Nó hiển thị nội dung như sau:
["Rakesh", {"marks": [50, 60, 70]}]
Hàm load()
Hàm này tải dữ liệu JSON từ tệp và xây dựng đối tượng Python từ nó. Tệp phải được mở với quyền đọc.
>>> fp = open('json.txt', 'r')
>>> ret = json.load(fp)
>>> ret
['Rakesh', {'marks': [50, 60, 70]}]
>>> fp.close()
Bài viết này bao gồm các hàm quan trọng trong module json.