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) → AddPost ProcessorsJSON 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 VariablesJMeter 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

{
  "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 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.

Teacher

Teacher

NGUYỄN TRÍ DIỆN

Fullstack QA

With over 4 years of experience in software testing — including manual, automation, and performance testing — I have built a strong foundation in delivering high-quality software.

I specialize in the E-commerce and Banking domains, with deep understanding of business flows, performance requirements, and testing standards.

Strong in critical thinking and problem-solving, I proactively identify issues and drive effective solutions.

With an engineering mindset, I continuously update my skills and contribute across functions to help teams achieve their goals.


Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học