CodeGym /Khóa học Java /Python SELF VI /Làm việc với JSON bằng json

Làm việc với JSON bằng json

Python SELF VI
Mức độ , Bài học
Có sẵn

2.1 Module json

JSON (JavaScript Object Notation) — là một định dạng trao đổi dữ liệu nhẹ, dễ đọc và viết đối với con người, và cũng dễ phân tích và sinh dữ liệu đối với máy tính. JSON thường được sử dụng để truyền dữ liệu giữa máy chủ và ứng dụng web, cũng như để lưu trữ cấu hình và cài đặt.

Module json trong Python cung cấp các chức năng để thực hiện serialization (chuyển đổi các đối tượng Python thành chuỗi JSON) và deserialization (chuyển đổi các chuỗi JSON thành đối tượng Python). Module này có sẵn trong thư viện chuẩn của Python và được sử dụng rộng rãi để làm việc với dữ liệu JSON.

Các chức năng chính của module json rất giống với pickle và hoạt động tương tự. Tiêu chuẩn mà!

  • Làm việc với chuỗi:
    • json.dumps(obj) — Chuyển đổi đối tượng Python thành chuỗi JSON.
    • json.loads(s) — Chuyển đổi chuỗi JSON thành đối tượng Python.
  • Làm việc với tệp:
    • json.dump(obj, file) — Thực hiện serialization đối tượng Python và ghi nó vào tệp văn bản.
    • json.load(file) — Thực hiện deserialization đối tượng Python từ tệp văn bản chứa dữ liệu ở định dạng JSON.

Hãy cùng xem một vài ví dụ để ghi nhớ cách hoạt động của các chức năng này.

2.2 Serialization thành chuỗi

Serialization đối tượng Python thành chuỗi JSON

Để thực hiện serialization một đối tượng thành chuỗi, chỉ cần truyền nó vào hàm json.dumps().


import json

# Ví dụ đối tượng để thực hiện serialization
data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"],
    "address": {
        "city": "New York",
        "zip_code": "10001"
    }
}
            
# Chuyển đổi đối tượng Python thành chuỗi JSON
json_string = json.dumps(data, indent=4)
print("Dữ liệu đã được serialize (JSON):", json_string)
        

Deserialization các chuỗi JSON thành đối tượng Python

Để lấy đối tượng từ chuỗi, chỉ cần truyền chuỗi JSON chứa mô tả đối tượng vào phương thức json.loads().


import json

# Ví dụ chuỗi JSON để thực hiện deserialization
json_string = '''
    {
        "name": "Alice",
        "age": 30,
        "is_student": false,
        "courses": ["Math", "Science"],
        "address": {
          "city": "New York",
          "zip_code": "10001"
        }
    }
    '''
            
# Chuyển đổi chuỗi JSON thành đối tượng Python
data = json.loads(json_string)
print("Dữ liệu đã được deserialize (Python):", data)
        

2.3 Serialization vào tệp

Ghi đối tượng Python vào tệp ở định dạng JSON

Để ghi đối tượng vào tệp, hãy gọi phương thức json.dump(). Khi làm việc với tệp, rất quan trọng để sử dụng xử lý ngoại lệ, nhằm xử lý một cách chính xác các lỗi có thể xảy ra. Đây là một ví dụ:


import json

# Ví dụ đối tượng để thực hiện serialization
data = {
    "name": "Bob",
    "age": 25,
    "is_student": True,
    "courses": ["History", "Literature"],
    "address": {
        "city": "Los Angeles",
        "zip_code": "90001"
    }
}
            
# Ghi đối tượng Python vào tệp JSON với xử lý ngoại lệ
try:
    with open('data.json', 'w') as file:
        json.dump(data, file, indent=4)
    print("Dữ liệu đã được ghi vào tệp thành công.")
except IOError:
    print("Lỗi khi ghi vào tệp.")
except json.JSONEncodeError:
    print("Lỗi khi mã hóa JSON.")
            
        

Đọc đối tượng Python từ tệp ở định dạng JSON

Đọc cũng rất đơn giản — chỉ cần truyền tệp vào phương thức json.load(). Ở đây cũng cần sử dụng xử lý ngoại lệ:


import json

# Đọc đối tượng Python từ tệp JSON với xử lý ngoại lệ
try:
    with open('data.json', 'r') as file:
        data = json.load(file)
    print("Dữ liệu đã được deserialize từ tệp (Python):", data)
except IOError:
    print("Lỗi khi đọc tệp.")
except json.JSONDecodeError:
    print("Lỗi khi giải mã JSON.")
        

2.4 Tham số bổ sung của các hàm

Trong hàm thực hiện serialization, có thể truyền các tham số bổ sung để làm cho JSON của bạn đẹp mắt hơn:

  • skipkeys: Nếu True, nó sẽ bỏ qua các khóa không phải là chuỗi, số hoặc None.
  • ensure_ascii: Nếu True, tất cả các ký tự không phải ASCII sẽ được thoát dưới dạng Unicode escape sequences.
  • indent: Nếu chỉ định số, thụt đầu dòng sẽ được thêm để dễ đọc hơn.
  • sort_keys: Nếu True, các khóa trong JSON sẽ được sắp xếp theo thứ tự bảng chữ cái.

Ví dụ sử dụng các tham số trong json.dumps():


import json

data = {"c": 3, "b": 2, "a": 1}
            
# Serialization với sắp xếp khóa và thụt đầu dòng
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
        

2.5 Bộ giải mã và mã hóa tùy chỉnh

Module json cho phép sử dụng các hàm tùy chỉnh để thực hiện serialization và deserialization các đối tượng.

Ví dụ về bộ mã hóa tùy chỉnh

Đầu tiên, chúng ta tạo một lớp mã hóa đặc biệt, bên trong kiểm tra rằng nếu kiểu đối tượng == datetime, thì trả về đối tượng dưới dạng chuỗi định dạng ISO.


import json
from datetime import datetime
            
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)
            
data = {
    "name": "Alice",
    "timestamp": datetime.now()
}
            
# Serialization với bộ mã hóa tùy chỉnh
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)

Ví dụ về bộ giải mã tùy chỉnh

Đối với thao tác ngược lại, chúng ta cũng cần một hàm, cái mà chuyển đổi chuỗi thành ngày tháng. Ví dụ, chúng ta có thể chỉ cần kiểm tra tên trường, và nếu nó được gọi là timestamp, thì chuyển đổi chuỗi thành đối tượng datetime:


import json
from datetime import datetime
        
def custom_decoder(dct):
    if 'timestamp' in dct:
        dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
    return dct
        
json_string = '''
{
    "name": "Alice",
    "timestamp": "2023-05-15T14:30:00"
}
'''
        
# Deserialization với bộ giải mã tùy chỉnh
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
    
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION