Cách phân tích JSON trong Python - Các bước dễ dàng

1 tháng 10 2024
5 phút đọc
Tóm tắt được tạo bởi AI:

JSON là viết tắt của JavaScript Object Notation. Nó không chỉ nhẹ mà còn dễ đọc và viết cho con người. Tương tự, máy móc cũng dễ dàng phân tích cú pháp và tạo ra. Phân tích cú pháp là rất quan trọng khi làm việc với nội dung từ API, tệp cấu hình hoặc các nguồn thông tin lưu trữ khác đối với bất kỳ lập trình viên Python nào. Bài viết này sẽ hướng dẫn bạn những điều cơ bản về cách phân tích cú pháp JSON bằng mô-đun của Python, bao gồm cách sử dụng json.dump trong Python để lưu nội dung.

Hiểu về JSON và cấu trúc của nó

JSON tổ chức dữ liệu theo các cặp key-value. Đây là một ví dụ cơ bản về một đối tượng:


{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"]
}

Ví dụ phân tích cú pháp JSON trong Python này bao gồm: một chuỗi, số, giá trị boolean và một mảng. Làm quen với cấu trúc này giúp bạn dễ dàng làm việc hơn trong Python.

Tương tác với JSON trong Python

Bằng cách sử dụng mô-đun tích hợp sẵn trong Python, bạn có thể dễ dàng phân tích chuỗi JSON. Mô-đun này bao gồm các phương thức như json.loads() để đọc từ chuỗi, và json.load() để đọc từ tệp. Ngược lại, json.dumps() và json.dump() được sử dụng để ghi dữ liệu ra chuỗi và tệp.

Đọc dữ liệu JSON

Hãy cùng xem cách đọc dữ liệu JSON, chúng ta sẽ thảo luận tiếp theo.

Đọc JSON từ một chuỗi

Nếu bạn muốn đọc JSON trong Python, hãy sử dụng json.loads() để phân tích một chuỗi và chuyển nó thành một đối tượng Python:


import json

json_string = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}'
data = json.loads(json_string)

print(data)

Kết quả:

1.png

Trích xuất JSON từ một tệp

Để trích xuất thông tin từ một tệp, hãy sử dụng phương thức này: json.load() và mở tệp JSON trong Python:


import json

with open('data.json', 'r') as file:
    data = json.load(file)

print(data)

Kết quả:

2.png

Ghi dữ liệu JSON

Trước khi ghi, bạn thường cần đọc hoặc tải thông tin hiện có — và đó là lúc phương thức python load json file trở nên hữu ích. Khi thông tin đã được tải đúng cách, bạn có thể chỉnh sửa và ghi lại ở các định dạng khác nhau.

Ghi JSON vào chuỗi

Để ghi thông tin ra chuỗi, hãy sử dụng phương thức json.dumps() trong Python:


import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

json_string = json.dumps(data)
print(json_string)

Kết quả:

3.png

Ghi JSON vào tệp

Để ghi nội dung này vào tệp, hãy sử dụng phương thức json.dump() trong Python:


import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

with open('data.json', 'w') as file:
    json.dump(data, file)

Quản lý JSON lồng nâng cao

Các đối tượng lồng nhau rất phổ biến khi làm việc với những cấu trúc thông tin phức tạp, và Python có thể dễ dàng xử lý những cấu trúc lồng này.


import json

nested_json_string = '''
{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"],
    "address": {
        "street": "123 Main St",
        "city": "Wonderland"
    }
}
'''

data = json.loads(nested_json_string)
print(data['address']['city'])

Kết quả:

4.png

Bộ mã hóa JSON tùy chỉnh

Ngôn ngữ không thể tự động chuyển tất cả các đối tượng tùy chỉnh thành JSON. Trong những trường hợp đó, bạn cần tạo một bộ mã hóa tùy chỉnh.


import json

class Student:
    def __init__(self, name, age, is_student):
        self.name = name
        self.age = age
        self.is_student = is_student

class StudentEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Student):
            return obj.__dict__
        return super().default(obj)

student = Student("Alice", 30, False)
json_string = json.dumps(student, cls=StudentEncoder)
print(json_string)

Kết quả:

5.png

Bộ giải mã JSON tùy chỉnh

Để giải mã thành các đối tượng tùy chỉnh, bạn cần triển khai một bộ giải mã tùy chỉnh biết cách xử lý chúng.


import json

class Student:
    def __init__(self, name, age, is_student):
        self.name = name
        self.age = age
        self.is_student = is_student

def student_decoder(dct):
    return Student(dct['name'], dct['age'], dct['is_student'])

json_string = '{"name": "Alice", "age": 30, "is_student": false}'
student = json.loads(json_string, object_hook=student_decoder)
print(student.name)

Kết quả:

6.png

Xử lý các vấn đề thường gặp

Làm việc với dữ liệu chi tiết có thể dẫn đến một số lỗi phổ biến, đặc biệt khi phân tích, tạo hoặc truy cập nội dung có cấu trúc. Sử dụng một trình phân tích JSON đáng tin cậy trong Python có thể giúp xác định và sửa các vấn đề này hiệu quả hơn. Dưới đây là một số lỗi phổ biến:

Định dạng JSON không hợp lệ

Một lỗi thường gặp khi phân tích tệp JSON là gặp định dạng không hợp lệ. Nó yêu cầu dấu ngoặc kép xung quanh các khóa và giá trị chuỗi, cũng như sắp xếp đúng các dấu ngoặc.


import json

invalid_json_string = "{'name': 'Alice', 'age': 30, 'is_student': False}"
try:
    data = json.loads(invalid_json_string)
except json.JSONDecodeError as e:
    print(f"Invalid JSON format: {e}")

Kết quả:

7.png

Xử lý khóa bị thiếu

Đôi khi, nội dung không bao gồm tất cả các khóa bạn mong đợi. Sử dụng phương thức get() giúp bạn xử lý an toàn các khóa bị thiếu bằng cách trả về giá trị mặc định thay vì báo lỗi.


import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)

is_student = data.get('is_student', False)
print(is_student)import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)

is_student = data.get('is_student', False)
print(is_student)

Gỡ lỗi các vấn đề khi phân tích JSON

Sử dụng mô-đun pdb để đặt các điểm dừng và gỡ lỗi mã phân tích của bạn.


import json
import pdb

json_string = '{"name": "Alice", "age": 30, "is_student": false}'
pdb.set_trace()
data = json.loads(json_string)
print(data)

Ví dụ thực tế về xử lý JSON trong web scraping

Web scraping thường liên quan đến việc truy xuất nội dung từ các dịch vụ trả về thông tin nhận được. Dưới đây là một ví dụ sử dụng thư viện requests cùng với endpoint https://httpbin.org/anything.

Trước khi bắt đầu, hãy kiểm tra rằng bạn đã cài đặt gói requests:


pip install requests

Khi làm việc với nội dung có cấu trúc, bạn có thể dùng thư viện requests để dễ dàng hơn. Chỉ cần gửi một yêu cầu GET tới URL với requests.get(url). Sau đó, bạn có thể phân tích phản hồi bằng response.json(). Từ đó, dễ dàng truy cập các phần thông tin cụ thể như headers, user agent, origin hoặc URL yêu cầu và in ra khi cần.

Mã này có xử lý lỗi mạnh mẽ; nó bắt json.JSONDecodeError khi xảy ra lỗi giải mã, và KeyError khi một khóa cụ thể không có, nhờ đó giúp chương trình tránh khỏi tình trạng “không có dữ liệu” bị crash. Sự chắc chắn này giúp xử lý tốt các nhiệm vụ web scraping thực tế.


import requests
import json

url = 'https://httpbin.org/anything'

response = requests.get(url)

try:
    data = response.json()

    # Trích xuất dữ liệu cụ thể từ phản hồi JSON
    headers = data['headers']
    user_agent = headers.get('User-Agent', 'N/A')
    origin = data.get('origin', 'N/A')
    url = data.get('url', 'N/A')

    print(f"User Agent: {user_agent}")
    print(f"Origin: {origin}")
    print(f"URL: {url}")

except json.JSONDecodeError:
    print("Error decoding JSON response")

except KeyError as e:
    print(f"Key error: {e} not found in the JSON response")

8.png

Mỗi lập trình viên đều nên biết cách phân tích tệp json trong python. Với mô-đun và phương pháp được hướng dẫn trong tài liệu này, bạn sẽ có thể đọc, ghi và gỡ lỗi nhanh chóng. Điều này đồng nghĩa với việc thường xuyên kiểm tra mã của bạn và sử dụng đúng công cụ cùng các tính năng mới nhất để đạt hiệu quả tốt hơn. Hướng dẫn này tập trung vào việc phân tích dữ liệu json trong python để giúp bạn thành thạo các tác vụ này hiệu quả.

Khi thực hiện web scraping, phân tích cú pháp trở nên thiết yếu vì nội dung từ các API web thường ở dạng này. Thành thạo trong việc xử lý và thao tác giúp bạn dễ dàng trích xuất thông tin giá trị từ nhiều nguồn.

Kết luận

Phân tích cú pháp là một kỹ năng then chốt cho bất kỳ lập trình viên nào làm việc với web API, tệp cấu hình hoặc các nguồn bên ngoài. Xử lý thông tin — dù là đọc từ chuỗi, tệp, ghi đầu ra có cấu trúc, hay làm việc với các đối tượng lồng và tùy chỉnh — được đơn giản hóa nhờ mô-đun tích hợp sẵn của Python. Các lập trình viên có thể sử dụng các phương thức json.load(), json.loads(), json.dump(), json.dumps() và học cách xử lý các vấn đề phổ biến, triển khai các bộ mã hóa hoặc giải mã tùy chỉnh, và tạo ra các ứng dụng tương tác thông tin mạnh mẽ, đáng tin cậy. Vì định dạng này là tiêu chuẩn web để trao đổi thông tin, các kỹ năng này rất giá trị trong việc scraping, xử lý nội dung và tích hợp nhiều dịch vụ thông qua API. Sử dụng mã python đơn giản để đọc tệp json giúp việc phân tích một tệp json trong python trở nên dễ dàng với bất kỳ dự án nào, trong khi json.dump cho phép lưu nội dung hiệu quả.

Nội dung của bài viết:

Các bài viết gần đây

Quay lại blog
Quay lại blog