json.dumps() và json.loads() – Xử lý JSON nhanh
- Home
- json.dumps() và json.loads() – Xử lý JSON nhanh
json.dumps() và json.loads() – Bí quyết xử lý JSON nhanh chóng và hiệu quả trong Python
JSON (JavaScript Object Notation) đã trở thành định dạng trao đổi dữ liệu phổ biến nhất trong lập trình hiện đại. Dù bạn làm việc với API, lưu trữ cấu hình hay xử lý NoSQL, việc chuyển đổi qua lại giữa cấu trúc dữ liệu của Python (như dict, list) và chuỗi JSON là một kỹ năng không thể thiếu.
Trong Python, mô-đun chuẩn json cung cấp hai hàm cốt lõi giúp bạn xử lý tác vụ này trong tích tắc: json.dumps() và json.loads(). Hãy cùng dcsofttech khám phá chi tiết cách sử dụng, sự khác biệt và các mẹo tối ưu hóa qua bài viết dưới đây.
dumps vs loadsTrước khi đi vào chi tiết từng hàm, hãy ghi nhớ một quy tắc đặt tên cực kỳ dễ hiểu từ Python:
Chữ s cuối cùng viết tắt của string (chuỗi).
Các hàm có chữ s (dumps, loads) làm việc trực tiếp với chuỗi (string) hoặc bytes.
Các hàm không có chữ s (dump, load) làm việc trực tiếp với file.
Bảng tóm tắt nhanh công dụng:
| Hàm | Tên gọi đầy đủ | Chức năng chính | Hướng chuyển đổi |
json.dumps() |
JSON Dump String | Chuyển đổi đối tượng Python thành chuỗi JSON | Python Object $\rightarrow$ JSON String |
json.loads() |
JSON Load String | Phân tích chuỗi JSON thành đối tượng Python | JSON String $\rightarrow$ Python Object |
json.dumps() – Đóng gói dữ liệu Python thành chuỗi JSONHàm json.dumps() (Serialization/Mã hóa) dùng để chuyển đổi các kiểu dữ liệu cơ bản của Python (dictionary, list, string, int, float, boolean, None) thành một chuỗi định dạng JSON chuẩn.
Python
import json
data = {
"id": 101,
"name": "DC SoftTech",
"active": True,
"skills": ["Python", "Django", "FastAPI"]
}
# Chuyển đổi dictionary thành chuỗi JSON
json_string = json.dumps(data)
print(json_string)
# Kết quả: {"id": 101, "name": "DC SoftTech", "active": true, "skills": ["Python", "Django", "FastAPI"]}
Khi làm việc thực tế, chuỗi JSON mặc định của dumps() thường bị dính liền một dòng, khó đọc. Bạn có thể tận dụng các tham số sau:
indent: Định dạng lề (thụt đầu dòng) để dễ đọc (pretty-print).
ensure_ascii=False: Giúp hiển thị đúng các ký tự tiếng Việt có dấu thay vì mã Unicode dạng \uXXXX.
sort_keys=True: Sắp xếp các khóa (key) theo thứ tự bảng chữ cái.
Python
formatted_json = json.dumps(data, indent=4, ensure_ascii=False, sort_keys=True)
print(formatted_json)
Kết quả:
JSON
{
"active": true,
"id": 101,
"name": "DC SoftTech",
"skills": [
"Python",
"Django",
"FastAPI"
]
}
json.loads() – Giải mã chuỗi JSON thành đối tượng PythonNgược lại với dumps(), hàm json.loads() (Deserialization/Giải mã) nhận vào một chuỗi (hoặc bytes) có cấu trúc JSON hợp lệ và phân tích nó thành các đối tượng tương ứng trong Python (chủ yếu là dict và list).
Python
import json
json_data = '{"id": 101, "name": "DC SoftTech", "active": true, "skills": ["Python", "FastAPI"]}'
# Chuyển đổi chuỗi JSON thành dictionary Python
python_obj = json.loads(json_data)
print(type(python_obj)) # <class 'dict'>
print(python_obj["name"]) # DC SoftTech
print(python_obj["skills"][0]) # Python
JSONDecodeError)Khi nhận dữ liệu JSON từ bên ngoài (như từ API bên thứ ba hoặc file cấu hình người dùng nhập), chuỗi JSON có thể bị lỗi cú pháp (thiếu dấu ngoặc kép, thừa dấu phẩy cuối…). Bạn nên bọc json.loads() trong khối try-except:
Python
import json
bad_json = '{"name": "DC SoftTech", "active": true,}' # Lỗi thừa dấu phẩy ở cuối
try:
data = json.loads(bad_json)
except json.JSONDecodeError as e:
print(f"Lỗi cú pháp JSON: {e}")
Khi chuyển đổi qua lại, Python và JSON có sự tương ứng về kiểu dữ liệu như sau:
| Python | JSON |
dict |
object |
list, tuple |
array |
str |
string |
int, float |
number |
True / False |
true / false |
None |
null |
Lưu ý: Tuple trong Python khi chuyển qua dumps() sẽ bị biến đổi thành dạng array ([]) của JSON.
Xử lý đối tượng phức tạp (như Datetime): Mặc định json.dumps() sẽ báo lỗi TypeError nếu gặp các kiểu dữ liệu không hỗ trợ trực tiếp như datetime. Bạn cần truyền thêm hàm default để xử lý:
Python
import json
from datetime import datetime
data = {"time": datetime.now()}
# Sử dụng .isoformat() để chuyển datetime thành string
json_str = json.dumps(data, default=str)
print(json_str)
Làm việc trực tiếp với File (json.dump và json.load): Thay vì đọc nội dung file ra biến string rồi dùng loads(), hãy dùng trực tiếp json.load() để tiết kiệm bộ nhớ:
Python
# Đọc file JSON
with open('config.json', 'r', encoding='utf-8') as f:
config = json.load(f)
# Ghi file JSON
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4, ensure_ascii=False)
Hiểu rõ và sử dụng thành thạo json.dumps() và json.loads() giúp bạn tối ưu hóa tốc độ xử lý dữ liệu, làm sạch mã nguồn và tránh được các lỗi liên quan đến định dạng dữ liệu trong Python. Hãy áp dụng ngay các tham số như ensure_ascii=False và indent để mã nguồn của bạn chuyên nghiệp và dễ bảo trì hơn!