Chuyển đến nội dung chính
Mô-đun 8 · Bài học 1 trong tổng số 429/36 trong khóa học~10 min
Bài học theo mô-đun (1/4)

JSON: tuần tự hóa và phân tích cú pháp

JSON là định dạng trao đổi dữ liệu phổ biến nhất. Mô-đun json trong thư viện chuẩn xử lý nó một cách tự nhiên.

Từ Python sang JSON: dumps

json.dumps(object) tuần tự hóa một đối tượng Python thành chuỗi JSON.

Python
import json

dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'

json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted

Từ JSON sang Python: loads

json.loads(string) phân tích chuỗi JSON và trả về các đối tượng Python.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

Kiểu ánh xạ

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

Từ tệp: dump / load

Python
with open("config.json", "w") as f:
    json.dump(dati, f, indent=2)

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

Không có "s" ở cuối, chúng hoạt động trên các tệp (giống như tệp), với "s" trên chuỗi.

Các loại không thể tuần tự hóa: default

datetime, set, các lớp tùy chỉnh của bạn không thể tuần tự hóa theo mặc định:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

Bạn có thể truyền hàm default để biết cách chuyển đổi chúng:

Python
def converti(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"non serializzabile: {type(obj)}")

json.dumps({"ora": datetime.datetime.now()}, default=converti)

Hoạt động JSON và tệp

Thư viện tiêu chuẩn cũng cung cấp json.dump() và json.load() (không có 's') để ghi và đọc dữ liệu JSON trực tiếp đến và từ các tệp, ghép nối tự nhiên với trình quản lý ngữ cảnh:

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

Hãy thử nó

tập thể dục#python.m8.l1.e1
Nỗ lực: 0Đang tải…

Cho `data = {'nome': 'Ada', 'anni': 36}`, tuần tự hóa nó thành JSON với indent=2 và gán cho biến `json_str`. Đánh giá `json_str`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

json.dumps(dữ liệu, thụt lề=2)

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#python.m8.l1.e2
Nỗ lực: 0Đang tải…

Cho chuỗi JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', hãy phân tích cú pháp chuỗi đó bằng json.loads vào dữ liệu và tính tổng các giá trị 'v'. Đánh giá tổng thể.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

json.loads trả về danh sách các ký tự.

Giải pháp khả dụng sau 3 lần thử

Thử thách bổ sung

tập thể dục#python.m8.l1.e3
Nỗ lực: 0Đang tải…

Cho chuỗi JSON \`json_data = '{"name": "Alice", "age": 30}'\`, hãy giải mã chuỗi đó thành từ điển Python bằng cách sử dụng \`json.loads\`. Trích xuất giá trị được liên kết với khóa \`'name'\` và lưu trữ nó trong \`user_name\`. Cuối cùng, đánh giá \`user_name\`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng json.loads(json_data) để giải mã, sau đó truy cập qua data['name'].

Giải pháp khả dụng sau 3 lần thử