Ví dụ JSONPath: Cách Đơn Giản Hóa Kiểm Thử API

Ashley Innocent

Ashley Innocent

18 tháng 7 2025

Ví dụ JSONPath: Cách Đơn Giản Hóa Kiểm Thử API

Phát triển API hiện đại đòi hỏi các kỹ thuật trích xuất và xác thực dữ liệu hiệu quả. Các biểu thức JSONPath cung cấp cho nhà phát triển các công cụ mạnh mẽ để điều hướng các cấu trúc JSON phức tạp và trích xuất các điểm dữ liệu cụ thể một cách chính xác. Cho dù bạn đang xây dựng các bài kiểm tra tự động, xử lý phản hồi API hay lọc các tập dữ liệu lớn, việc hiểu các ví dụ JSONPath thực tế trở nên cần thiết cho các quy trình phát triển hợp lý.

💡
Bạn đã sẵn sàng để tăng cường thử nghiệm API và trích xuất dữ liệu của mình chưa? Tải xuống Apidog miễn phí và trải nghiệm các khả năng JSONPath nâng cao với giao diện trực quan giúp việc điều hướng dữ liệu phức tạp trở nên dễ dàng.
button

Tìm hiểu các nguyên tắc cơ bản của JSONPath

JSONPath hoạt động như một ngôn ngữ truy vấn được thiết kế đặc biệt cho các cấu trúc dữ liệu JSON. Nó cho phép bạn điều hướng qua các phần tử và thuộc tính trong cấu trúc JSON, trích xuất giá trị và thậm chí áp dụng các bộ lọc. Nó được sử dụng rộng rãi trong các công cụ kiểm thử API như Postman, RestAssured, StepCI, k6, v.v. Không giống như các phương pháp phân tích cú pháp truyền thống, các biểu thức JSONPath cung cấp cú pháp ngắn gọn tương tự như XPath cho các tài liệu XML.

Phần tử gốc trong bất kỳ biểu thức JSONPath nào bắt đầu bằng dấu đô la ($), đại diện cho toàn bộ tài liệu JSON. Từ điểm khởi đầu này, các nhà phát triển có thể duyệt qua các đối tượng, mảng lồng nhau và áp dụng các điều kiện lọc phức tạp để trích xuất chính xác dữ liệu họ cần.

Các phần tử cú pháp JSONPath thiết yếu

Điều hướng đường dẫn cơ bản

Các biểu thức JSONPath tuân theo một mẫu ký hiệu dấu chấm đơn giản. Các biểu thức đơn giản nhất truy cập trực tiếp các thuộc tính của đối tượng gốc:

$.propertyName
$.user.name
$.response.data.items

Các biểu thức này điều hướng qua các hệ thống phân cấp đối tượng lồng nhau, cho phép nhà phát triển tiếp cận các giá trị được nhúng sâu mà không cần logic phân tích cú pháp phức tạp.

Các mẫu truy cập mảng

Điều hướng mảng trong JSONPath hỗ trợ nhiều phương thức truy cập. Truy cập dựa trên chỉ mục sử dụng ký hiệu dấu ngoặc vuông:

$.users[0]          // Phần tử đầu tiên
$.users[1,3,5]      // Nhiều phần tử cụ thể
$.users[-1]         // Phần tử cuối cùng
$.users[1:3]        // Cắt từ chỉ mục 1 đến 2

Các phép toán ký tự đại diện cho phép trích xuất dữ liệu hàng loạt:

$.users[*]          // Tất cả các phần tử mảng
$.users[*].name     // Tất cả tên người dùng
$.products[*].price // Tất cả giá sản phẩm

Các phép toán đệ quy xuống cấp

Toán tử hai chấm (..) thực hiện tìm kiếm đệ quy trong toàn bộ cấu trúc JSON:

$..name             // Tất cả các thuộc tính 'name' ở bất kỳ cấp độ nào
$..products[*]      // Tất cả các mảng sản phẩm ở bất kỳ đâu
$..price            // Tất cả các giá trị giá đệ quy

Toán tử này tỏ ra vô giá khi xử lý các cấu trúc JSON không xác định hoặc biến đổi, nơi dữ liệu mục tiêu có thể tồn tại ở các cấp độ lồng khác nhau.

Các kỹ thuật lọc nâng cao

Lọc có điều kiện

Bộ lọc là các biểu thức logic được sử dụng để lọc mảng. Một ví dụ về biểu thức JSONPath với bộ lọc là ... trong đó @ đại diện cho mục mảng hiện tại hoặc đối tượng đang được xử lý. Các biểu thức bộ lọc cho phép lựa chọn dữ liệu tinh vi dựa trên các tiêu chí cụ thể:

$.users[?(@.age > 18)]              // Người dùng trên 18 tuổi
$.products[?(@.price < 50)]         // Sản phẩm dưới 50 đô la
$.orders[?(@.status == 'pending')]  // Chỉ các đơn hàng đang chờ xử lý

Ký hiệu @ đại diện cho phần tử mảng hiện tại đang được đánh giá, cho phép lọc phức tạp dựa trên thuộc tính.

Các phép toán logic phức tạp

Bạn có thể tạo các bộ lọc phức tạp hơn với các toán tử logic && và ||. Nhiều điều kiện có thể được kết hợp bằng cách sử dụng các toán tử boolean:

$.products[?(@.price > 10 && @.category == 'electronics')]
$.users[?(@.age >= 21 || @.verified == true)]
$.orders[?(@.total > 100 && @.status != 'cancelled')]

Các biểu thức này cho phép lọc dữ liệu chính xác dựa trên nhiều tiêu chí, điều cần thiết cho việc xử lý phản hồi API phức tạp.

Đối sánh chuỗi và mẫu

Lọc dựa trên chuỗi hỗ trợ các phép toán so sánh khác nhau:

$.products[?(@.name =~ /^iPhone/)]      // Tên bắt đầu bằng 'iPhone'
$.users[?(@.email =~ /.*@gmail\.com/)]  // Người dùng Gmail
$.items[?(@.description contains 'sale')] // Các mặt hàng đang giảm giá

Hỗ trợ biểu thức chính quy khác nhau giữa các triển khai JSONPath, nhưng hầu hết các công cụ hiện đại đều hỗ trợ đối sánh mẫu cơ bản.

Ứng dụng kiểm thử API thực tế

Ví dụ về xác thực phản hồi

Kiểm thử API thường xuyên yêu cầu xác thực các phần tử phản hồi cụ thể. Các ví dụ JSONPath thể hiện các chiến lược xác thực hiệu quả:

// Xác thực phản hồi đăng ký người dùng
$.response.user.id              // Trích xuất ID người dùng
$.response.user.email           // Xác minh gán email
$.response.permissions[*].name  // Kiểm tra các quyền được gán

Các biểu thức này cho phép xác minh tự động các phản hồi API, đảm bảo tính toàn vẹn của dữ liệu và chức năng phù hợp.

Quy trình chuyển đổi dữ liệu

Các biểu thức JSONPath tạo điều kiện thuận lợi cho việc chuyển đổi dữ liệu giữa các định dạng khác nhau:

// Trích xuất dữ liệu danh mục sản phẩm
$.catalog.products[*].{
  id: @.productId,
  name: @.title,
  cost: @.pricing.retail
}

Cách tiếp cận này hợp lý hóa các hoạt động ánh xạ dữ liệu, đặc biệt hữu ích khi tích hợp nhiều dịch vụ API.

Xử lý lỗi và gỡ lỗi

Các biểu thức JSONPath hỗ trợ phát hiện lỗi và gỡ lỗi:

$.errors[*].message             // Tất cả các thông báo lỗi
$.response.warnings[?(@.level == 'critical')]  // Cảnh báo nghiêm trọng
$..stackTrace                   // Tất cả các dấu vết ngăn xếp

Các mẫu này giúp nhà phát triển xác định và giải quyết các vấn đề trong quá trình phát triển và kiểm thử API.

Các chiến lược tối ưu hóa hiệu suất

Lựa chọn đường dẫn hiệu quả

Tối ưu hóa các biểu thức JSONPath cải thiện đáng kể hiệu suất ứng dụng. Các đường dẫn cụ thể hoạt động tốt hơn các phép toán ký tự đại diện:

// Hiệu quả - đường dẫn trực tiếp
$.users[0].profile.name

// Kém hiệu quả - tìm kiếm ký tự đại diện
$.users[*].profile.name

Truy cập đường dẫn trực tiếp giảm chi phí tính toán, đặc biệt với các tập dữ liệu JSON lớn.

Các mẫu bộ nhớ đệm và tái sử dụng

Các biểu thức JSONPath đã biên dịch mang lại lợi ích về hiệu suất khi được sử dụng lặp đi lặp lại:

// Biên dịch một lần, sử dụng nhiều lần
const userNamePath = JSONPath.compile('$.users[*].name');
const userNames = userNamePath.evaluate(jsonData);

Cách tiếp cận này giảm thiểu chi phí phân tích cú pháp trong các hoạt động tần số cao.

Tích hợp với các công cụ phát triển hiện đại

Lợi ích tích hợp Apidog

Apidog cung cấp hỗ trợ JSONPath toàn diện cho kiểm thử và phát triển API. Nền tảng này cung cấp các trình tạo JSONPath trực quan, kiểm thử biểu thức thời gian thực và khả năng xác thực tự động. Các nhà phát triển có thể tạo các quy trình trích xuất dữ liệu phức tạp mà không cần viết biểu thức thủ công.

button

Trình gỡ lỗi JSONPath của công cụ cho phép đánh giá biểu thức từng bước, giúp dễ dàng hiểu và tối ưu hóa các truy vấn phức tạp. Ngoài ra, các tính năng cộng tác của Apidog cho phép các nhóm chia sẻ các mẫu JSONPath và các phương pháp hay nhất.

Hình ảnh hiển thị bảng điều khiển của Apidog

Dưới đây là cách Apidog có thể giúp bạn khai thác sức mạnh của JSONPath một cách hiệu quả:

Đầu tiên, bạn cần gửi yêu cầu đến các API của mình và xem trực tiếp các phản hồi bằng Apidog. Sau đó, bạn có thể sử dụng giao diện được cung cấp để áp dụng truy vấn JSONPath để trích xuất tiêu đề của tất cả các bộ phim hành động từ phản hồi.

Trang bộ xử lý hậu kỳ của Apidog

Từ ảnh chụp màn hình ở trên, bạn sẽ thấy rằng (1) chúng tôi gửi một yêu cầu GET đến máy chủ của chúng tôi - tôi đã tạo một máy chủ express đơn giản sử dụng dữ liệu JSON mà chúng tôi đã nhận được ở trên làm phản hồi. Sau đó, tôi chuyển sang tab Bộ xử lý hậu kỳ (2) và thêm một quy trình mới - Trích xuất biến (3).

Khi nhấp vào Trích xuất biến, bạn sẽ được hiển thị trang dưới đây;

Trang cấu hình JSONPath trích xuất của Apidog

Bạn có thể đặt tên biến (1) nếu muốn. Các biến hữu ích nếu bạn muốn giám sát hoặc xây dựng các API khác nhau và bạn cần một nơi duy nhất để quản lý cấu hình chung. Các biến ở đây giống như các tệp .env.

Bước tiếp theo là nhập JSONPath bạn muốn lọc (2). Trong trường hợp của chúng tôi ở đây, chúng tôi muốn lấy tiêu đề của các bộ phim trong mảng hành động của JSON của chúng tôi. Khi bạn nhập đường dẫn hiện tại, nhấp vào nút mũi tên (3) để mở trang phản hồi của truy vấn như hình dưới đây.

Phản hồi jsonpath apidog

Như bạn có thể thấy từ phản hồi ở trên, Apidog đã lọc ra tiêu đề của các bộ phim trong mảng hành động và hiển thị chúng cho chúng tôi.

Nếu bạn muốn thử điều này, hãy đảm bảo tải xuống và cài đặt Apidog và gửi yêu cầu đầu tiên của bạn với nó.

Tích hợp khung kiểm thử

Các khung kiểm thử phổ biến tích hợp chức năng JSONPath:

// Tích hợp Jest
expect(jsonPath.query(response, '$.users[*].name')).toContain('John');

// Mocha với JSONPath
const userCount = jsonPath.query(data, '$.users.length')[0];
assert.equal(userCount, 5);

Những tích hợp này hợp lý hóa các quy trình kiểm thử tự động và cải thiện khả năng bảo trì kiểm thử.

Các ví dụ JSONPath phổ biến theo trường hợp sử dụng

Các kịch bản API thương mại điện tử

Các API thương mại điện tử được hưởng lợi từ các ví dụ JSONPath chuyên biệt:

// Kết quả tìm kiếm sản phẩm
$.products[?(@.inStock == true && @.price <= 100)]

// Xử lý đơn hàng
$.orders[?(@.status == 'shipped')].trackingNumber

// Dữ liệu khách hàng
$.customers[?(@.loyaltyLevel == 'premium')].benefits[*]

Các biểu thức này xử lý hiệu quả các nhu cầu trích xuất dữ liệu thương mại điện tử điển hình.

Các mẫu API mạng xã hội

Các API mạng xã hội yêu cầu các cách tiếp cận JSONPath khác nhau:

// Số liệu tương tác bài đăng
$.posts[*].{likes: @.likes, shares: @.shares, comments: @.comments.length}

// Lọc hoạt động người dùng
$.activities[?(@.type == 'post' && @.timestamp > '2024-01-01')]

// Kiểm duyệt nội dung
$.reports[?(@.severity == 'high' && @.resolved == false)]

Các mẫu này giải quyết các yêu cầu xử lý dữ liệu mạng xã hội phổ biến.

Ứng dụng API tài chính

Các API tài chính yêu cầu trích xuất dữ liệu chính xác:

// Lọc giao dịch
$.transactions[?(@.amount > 1000 && @.category == 'investment')]

// Tổng hợp số dư tài khoản
$.accounts[*].balances[?(@.currency == 'USD')].amount

// Dữ liệu đánh giá rủi ro
$.assessments[?(@.score < 600)].recommendations[*]

Các ví dụ này thể hiện tiện ích của JSONPath trong các kịch bản xử lý dữ liệu tài chính.

Các kỹ thuật xử lý lỗi và gỡ lỗi

Lỗi biểu thức phổ biến

Các biểu thức JSONPath có thể thất bại do nhiều vấn đề khác nhau. Việc hiểu các mẫu lỗi phổ biến giúp ngăn ngừa sự cố:

// Cú pháp không hợp lệ
$.users[name]           // Thiếu dấu ngoặc kép
$.users[?@.age > 18]    // Thiếu dấu ngoặc đơn

// Cú pháp đúng
$.users['name']         // Truy cập thuộc tính
$.users[?(@.age > 18)]  // Cú pháp bộ lọc phù hợp

Xác thực cú pháp phù hợp ngăn ngừa lỗi thời gian chạy và cải thiện độ tin cậy của ứng dụng.

Các chiến lược gỡ lỗi

Gỡ lỗi hiệu quả đòi hỏi các cách tiếp cận có hệ thống:

  1. Đánh giá từng bước: Chia các biểu thức phức tạp thành các phần nhỏ hơn
  2. Kiểm thử với dữ liệu mẫu: Xác minh các biểu thức với các tập dữ liệu đã biết
  3. Sử dụng công cụ trực quan hóa: Sử dụng các trình đánh giá JSONPath trực tuyến để kiểm thử
  4. Ghi lại kết quả trung gian: Xuất kết quả truy vấn một phần để xác minh

Các chiến lược này giúp nhà phát triển nhanh chóng xác định và giải quyết các vấn đề liên quan đến JSONPath.

Các phương pháp hay nhất để triển khai JSONPath

Khả năng đọc biểu thức

Các biểu thức JSONPath dễ đọc cải thiện khả năng bảo trì mã:

// Tốt - rõ ràng và mô tả
const activePremiumUsers = '$.users[?(@.status == "active" && @.tier == "premium")]';

// Kém - khó hiểu và không rõ ràng
const users = '$.u[?(@.s=="a"&&@.t=="p")]';

Các biểu thức mô tả nâng cao sự cộng tác của nhóm và giảm thời gian gỡ lỗi.

Các cân nhắc về bảo mật

Các biểu thức JSONPath nên xác thực dữ liệu đầu vào để ngăn ngừa các lỗ hổng bảo mật:

// Xác thực cấu trúc JSON trước khi truy vấn
if (jsonData && typeof jsonData === 'object') {
  const result = JSONPath.query(jsonData, expression);
  // Xử lý kết quả an toàn
}

Xác thực đầu vào ngăn ngừa các vấn đề bảo mật tiềm ẩn và sự cố ứng dụng.

Giám sát hiệu suất

Giám sát hiệu suất biểu thức JSONPath trong môi trường sản xuất:

const startTime = performance.now();
const result = JSONPath.query(largeDataset, complexExpression);
const endTime = performance.now();
console.log(`Thời gian thực thi JSONPath: ${endTime - startTime}ms`);

Giám sát hiệu suất giúp xác định các điểm nghẽn và tối ưu hóa các hoạt động quan trọng.

Những phát triển và xu hướng trong tương lai

Khả năng lọc nâng cao

Các triển khai JSONPath trong tương lai có thể bao gồm các tùy chọn lọc tinh vi hơn:

Những cải tiến này sẽ mở rộng khả năng áp dụng JSONPath trong các trường hợp sử dụng đa dạng.

Sự phát triển của tích hợp công cụ

Các công cụ phát triển tiếp tục mở rộng hỗ trợ JSONPath:

Những cải tiến này giúp JSONPath dễ tiếp cận hơn với các nhà phát triển ở mọi cấp độ kỹ năng.

Kết luận

Các ví dụ JSONPath thể hiện các khả năng mạnh mẽ có sẵn để trích xuất và thao tác dữ liệu JSON. Từ truy cập thuộc tính cơ bản đến các hoạt động lọc phức tạp, các biểu thức này cho phép nhà phát triển xử lý các yêu cầu xử lý dữ liệu tinh vi một cách hiệu quả. Việc tích hợp JSONPath với các công cụ phát triển hiện đại như Apidog càng nâng cao năng suất và khả năng cộng tác.

Thành thạo các ví dụ JSONPath đòi hỏi thực hành với các tình huống thực tế và hiểu biết về cả cú pháp cơ bản và các tính năng nâng cao. Khi các API ngày càng trở nên phức tạp và các ứng dụng dựa trên dữ liệu ngày càng tinh vi, các kỹ năng JSONPath trở nên cần thiết cho các quy trình phát triển hiệu quả.

button

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API