NỘI DUNG BÀI HỌC
✅ Khái niệm json
✅ Jsonpath
✅ JSON Extractor
✅ Ví dụ minh họa
✅ Best practices
📘 JSON Extractor (JSONPath)
1. Json là gì?

- JSON (JavaScript Object Notation) là một dạng lưu trữ và trao đổi dữ liệu rất gọn nhẹ.
- Người dùng có thể dễ dàng đọc và viết JSON.
- Máy tính cũng dễ dàng xử lý và tạo ra JSON.
- JSON được xây dựng dựa trên hai dạng chính:
- Dạng cặp khóa/giá trị. Trong nhiều ngôn ngữ lập trình, dạng này được thể hiện như đối tượng (object), bảng từ điển (dictionary), bảng băm (hash table), hay danh sách khóa–giá trị.
- Dạng danh sách có thứ tự. Trong hầu hết các ngôn ngữ, dạng này được thể hiện như mảng (array), danh sách (list), vector hoặc chuỗi tuần tự.
Cấu trúc JSON: Object
- Object (đối tượng) là một tập hợp các cặp khóa – giá trị (name/value pairs), không theo thứ tự cố định.
- Một object luôn bắt đầu bằng { (dấu ngoặc nhọn trái) và kết thúc bằng } (dấu ngoặc nhọn phải).
- Mỗi tên đi kèm một giá trị, và được nối với nhau bằng dấu : (hai chấm).
- Giữa các cặp tên – giá trị được phân tách bằng dấu , (dấu phẩy).
👉 Nói ngắn gọn: object giống như một “bảng thông tin” gồm nhiều thuộc tính (tên) và giá trị tương ứng.
Ví dụ:
{ "name": "Tom", "age": 30, "city": "Ho Chi Minh"}
Ở đây:
- name là tên thuộc tính, "Tom" là giá trị.
- age là tên thuộc tính, 30 là giá trị.
- city là tên thuộc tính, "Ho Chi Minh" là giá trị.
2. JSONPath

- JSONPath là một ngôn ngữ truy vấn dùng để trích xuất dữ liệu từ tài liệu JSON.
- Nó tương tự như XPath trong XML, nhưng áp dụng cho JSON.
- Trong JMeter, JSON Extractor sử dụng JSONPath để lấy dữ liệu từ response.
a. Cú pháp cơ bản
Cú pháp |
Ý nghĩa |
Ví dụ |
$ |
Root (gốc của JSON) |
$.order.id |
. |
Truy cập thuộc tính con |
$.user.name |
[*] |
Chọn tất cả phần tử trong mảng |
$.users[*].id |
[n] |
Phần tử thứ n (bắt đầu từ 0) |
$.users[0].name |
[-1] |
Phần tử cuối cùng |
$.users[-1].name |
.. |
Tìm ở mọi cấp (recursive descent) |
$..price |
?() |
Biểu thức lọc |
$.products[?(@.price>1000)] |
@ |
Đối tượng hiện tại khi lọc |
$.products[?(@.name=="iPhone 15")] |
3. JSON Extractor
JSON Extractor dùng để trích xuất dữ liệu từ response JSON. Thường áp dụng cho REST API.
Vị trí thêm: (Sampler) → Add → Post Processors → JSON Extractor
Trường cấu hình quan trọng:
- Name of created variable(s): Tên biến kết quả (ví dụ: authToken, hoặc nhiều biến cách nhau bởi ;).
- JSON Path expressions: Biểu thức JSONPath, tương ứng 1–1 với tên biến ở trên (cũng cách nhau bởi ;).
- Match No:
- 1, 2, 3… → Lấy giá trị thứ n trong danh sách kết quả. (Index bắt đầu từ 1, không phải 0)
- -1 → Lấy tất cả kết quả khớp, JMeter sẽ sinh ra nhiều biến (ví dụ ${var_1}, ${var_2}, …, ${var_matchNr} = tổng số match).
- 0 → Lấy ngẫu nhiên một kết quả bất kỳ trong danh sách (random).
- Default Values: Giá trị mặc định nếu không tìm thấy.
- (Tuỳ phiên bản) Compute concatenation var: Tạo biến nối tất cả kết quả bằng dấu , hoặc ký tự khác.
Biến sinh ra khi Match Numbers = -1: ${var_1}, ${var_2}, … và ${var_matchNr} (tổng số match).
4. Ví dụ
a. Lấy giá trị đơn
Response:
{
"status": "success",
"user": { "id": 12345, "name": "Nguyen Van A", "token": "abc123xyz" }
}
- Var: authToken
- JSONPath: $.user.token
- Match No.: 1 → ${authToken} = abc123xyz
b. Lấy phần tử trong mảng
Response:
{ "users": [ {"id":101}, {"id":102}, {"id":103} ] }
- Var: uid
- JSONPath: $.users[*].id
- Match No.: -1
→ ${uid_1}=101, ${uid_2}=102, ${uid_3}=103, ${uid_matchNr}=3
c. Wildcard, deep-scan
Response:
{"a": {"id": 1}, "b": {"id": 2}, "c": {"x": {"id": 3}}}
- JSONPath: $..id (deep-scan mọi cấp)
→ 1, 2, 3 (với -1)
d. Lọc theo điều kiện
Response:
{ "products": [
{"id":1, "name":"iPhone 15", "price":2500},
{"id":2, "name":"Samsung S24", "price":1800},
{"id":3, "name":"Xiaomi 14", "price":900}
]}
- Lấy id theo name:
JSONPath: $.products[?(@.name=='Samsung S24')].id → 2 - Lấy name price > 1000:
$.products[?(@.price>1000)].name → ["iPhone 15","Samsung S24"]
Lưu ý: Filter trả một mảng. Dùng -1 để nhận từng phần tử ${var_1}, ${var_2}…
e. Nhiều biến – nhiều biểu thức trong 1 extractor
Response:
{
"order": {
"id": "ORD12345",
"date": "2025-08-26",
"customer": { "name": "Nguyen Van A", "email": "vana@example.com", "address": { "city": "Hanoi", "zip": "100000" } },
"items": [
{ "sku": "IP15", "name": "iPhone 15", "qty": 1, "price": 2500 },
{ "sku": "S24", "name": "Samsung S24", "qty": 2, "price": 1800 }
],
"status": "PAID"
}
}
- Name of variables: orderId;customerName;city
- JSONPath expressions: $.order.id;$.order.customer.name;$.order.customer.address.city
- Default Values: NA;NA;NA
f. Khoá động (dynamic keys)
Response:
{ "meta": { "v2025-08": {"build": 776, "status":"ok"} } }
- Khi khoá con biến đổi theo phiên bản, dùng deep-scan:
JSONPath: $..build → 776
g. Lấy mảng lồng nhau (nested arrays)
Response:
{ "order": { "items": [
{"sku":"A1","batches":[{"lot":"L1"},{"lot":"L2"}]},
{"sku":"B2","batches":[{"lot":"L3"}]}
]}}
- JSONPath: $.order.items[*].batches[*].lot + -1
→ ${lot_1}=L1, ${lot_2}=L2, ${lot_3}=L3
h. Chuỗi JSON trong JSON (cần 2 bước)
Response:
{ "data": "{\"token\":\"ABC123\"}" }
- B1 JSON Extractor lấy chuỗi: $.data → ${raw}
- B2 JSON Extractor (áp trên Sample Variables → JMeter Variables):
- Variable names: token
- JSONPath: $.token
- JMeter Variable Name to use: raw (tuỳ cách bạn tổ chức; hoặc dùng JSR223 để parse)
i. Lọc nâng cao
Lấy id của sản phẩm có price > 900 và name là Samsung S24
- → $.products[?(@.price > 900 && @.name == "Samsung S24")].id
k. Xử lý không tồn tại (graceful)
- Set Default Value rõ ràng (NOT_FOUND), tránh rỗng gây lỗi tham chiếu ở bước sau.
- Kết hợp Response Assertion để fail sớm nếu token không được trả về.
5. Bestpractice
- Dùng $..field để tìm ở mọi cấp, nhưng cẩn trọng số lượng match.
- Luôn cấu hình Default Values khi phát triển kịch bản.
- Giữ JSONPath ngắn & ổn định, hạn chế phụ thuộc thứ tự nếu API có thể đổi.