Cách phân tích JSON trong Python - Các bước dễ dàng
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ả:

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ả:

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ả:

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ả:

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ả:

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ả:

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ả:

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")

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ả.
