2.28. JSON

JSON (JavaScript Object Notation) là một định dạng văn bản nhỏ gọn, dễ đọc cho dữ liệu có cấu trúc. Nó định nghĩa sáu kiểu -- string, number, boolean, null, array, và object -- mỗi kiểu ánh xạ trực tiếp vào một giá trị Python, vì vậy việc chuyển đổi giữa Python và JSON chỉ là một lời gọi hàm theo cả hai hướng.

JSON là ngôn ngữ chung của các file cấu hình và web API. Hãy dùng nó bất cứ khi nào bạn cần lưu một bộ cài đặt nhỏ vào đĩa theo dạng bạn cũng có thể đọc bằng mắt, hoặc để trao đổi dữ liệu có cấu trúc với một chương trình khác.

Hai hàm đáp ứng hầu hết nhu cầu:

  • json.dumps() -- dump string: chuyển một giá trị Python thành một chuỗi JSON.

  • json.loads() -- load string: phân tích một chuỗi JSON trở lại thành Python.

Cặp json.dump / json.load (không có s) thực hiện cùng công việc nhưng nhận trực tiếp một đối tượng file.

2.28.1. Mã hóa (dumps)

import json

config = {
    "name":  "OpenMV",
    "width": 320,
    "tags":  ["red", "round"],
}

text = json.dumps(config)
print(text)

Kết quả:

{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}

Ánh xạ là:

Bất cứ thứ gì nằm ngoài tập hợp đó (một lớp tùy chỉnh, bộ đệm bytes, một set) sẽ ném TypeError. Hãy chuyển đổi giá trị trước.

Ghi chú

Hàm json.dumps() của CPython chấp nhận đối số indent để in đẹp; của MicroPython thì không. Nút điều chỉnh định dạng duy nhất là separators, kiểm soát khoảng cách nội tuyến -- truyền (',', ':') để có dạng nhỏ gọn nhất. Đầu ra nhiều dòng, có thụt lề phải được tạo bằng tay nếu cần.

2.28.2. Giải mã (loads)

text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])

Kết quả:

OpenMV 320

Các JSON object trở thành dict, array trở thành list, và phần còn lại ánh xạ trở lại tương đương Python. JSON không hợp lệ sẽ ném ValueError.

2.28.3. Đọc và ghi file

Cặp dựa trên file hoạt động tốt với with:

import json

with open("config.json") as f:
    config = json.load(f)

config["width"] = 640

with open("config.json", "w") as f:
    json.dump(config, f)

Hãy coi file JSON là một bản ghi hoàn chỉnh -- đọc vào, sửa đổi giá trị Python, ghi lại. Cố gắng chỉnh sửa JSON tại chỗ bên trong file thường tạo ra nhiều lỗi hơn so với lợi ích.