ToolDeck

ทดสอบ JSONPath

ทดสอบนิพจน์ JSONPath กับข้อมูล JSON และดูผลลัพธ์ที่ตรงกัน

ลองตัวอย่าง

ข้อมูล JSON

ผลลัพธ์

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
ผลลัพธ์จะปรากฏที่นี่…

JSONPath คืออะไร?

JSONPath คือภาษาคิวรีสำหรับดึงค่าจากเอกสาร JSON เดิมทีเสนอโดย Stefan Goessner ในปี 2007 เพื่อเป็นตัวเทียบเคียงกับ XPath สำหรับ XML โดย JSONPath ช่วยให้คุณเขียนนิพจน์อย่าง $.store.book[*].author เพื่อเลือกฟิลด์ author ทั้งหมดภายในอาร์เรย์ book โดยไม่ต้องเขียนลูปหรือโค้ดสำรวจด้วยตนเอง ภาษานี้ได้รับการกำหนดมาตรฐานในเดือนกุมภาพันธ์ 2024 ในรูป RFC 9535 ซึ่งเผยแพร่โดย IETF

นิพจน์ JSONPath จะเริ่มต้นด้วย $ เสมอ ซึ่งแทนรากของเอกสาร จากนั้นจึงต่อตัวเลือก: dot notation สำหรับคีย์ออบเจกต์ bracket notation สำหรับดัชนีอาร์เรย์ wildcard สำหรับลูกทุกตัว และตัวดำเนินการ recursive descent (..) สำหรับค้นหาในทุกระดับของการซ้อน นิพจน์ตัวกรองเช่น [?(@.price < 10)] ช่วยให้คุณเลือกองค์ประกอบตามเงื่อนไขที่ประเมินจากค่าของมัน

JSONPath ถูกใช้งานในเครื่องมือทดสอบ API เช่น Postman แพลตฟอร์ม observability เช่น Datadog และ Splunk เครื่องยนต์เวิร์กโฟลว์เช่น Apache NiFi และไลบรารีในภาษาต่าง ๆ ได้แก่ JavaScript, Python, Go, Java และ C# การทดสอบนิพจน์กับข้อมูลจริงก่อนนำไปฝังในโค้ดหรือไฟล์คอนฟิกจะช่วยป้องกันความล้มเหลวที่ตรวจจับได้ยากเมื่อโครงสร้าง JSON ไม่ตรงกับที่คาดไว้

ทำไมต้องใช้เครื่องมือทดสอบ JSONPath นี้?

การเขียนนิพจน์ JSONPath ด้วยมือเป็นเรื่องที่เกิดข้อผิดพลาดได้ง่าย จุด bracket ที่หายไป หรือไวยากรณ์ตัวกรองที่ผิดพลาดอาจทำให้ได้ผลลัพธ์ว่างเปล่าโดยไม่มีข้อความแสดงข้อผิดพลาด เครื่องมือนี้ให้ฟีดแบ็กภาพทันทีว่านิพจน์ของคุณตรงกับอะไร

ผลลัพธ์ทันที
วาง JSON พิมพ์นิพจน์ แล้วดูค่าที่ตรงกันอัปเดตแบบเรียลไทม์ ไม่จำเป็นต้องรันสคริปต์หรือโหลดหน้าใหม่เพื่อตรวจสอบคิวรีของคุณ
🔒
ให้ความสำคัญกับความเป็นส่วนตัว
การประมวลผลทั้งหมดทำงานในเบราว์เซอร์ของคุณ ข้อมูล JSON ของคุณไม่เคยออกจากเครื่อง ดังนั้นคุณสามารถทดสอบนิพจน์กับการตอบสนอง API จริงหรือไฟล์คอนฟิกที่มีข้อมูลสำคัญได้อย่างปลอดภัย
📋
คัดลอกผลลัพธ์โดยตรง
คัดลอกผลลัพธ์ที่ตรงกันเป็น JSON ด้วยคลิกเดียว วางลงใน test assertions เอกสาร หรือตัวอย่างการตอบสนอง API โดยไม่ต้องจัดรูปแบบใหม่
🛠️
ไม่ต้องตั้งค่า
ไม่ต้องติดตั้งแพ็กเกจ npm ไม่ต้องสร้าง Python virtualenv เพียงเปิดหน้า วางข้อมูล แล้วเริ่มคิวรีได้เลย ใช้งานได้บนทุกอุปกรณ์ที่มีเบราว์เซอร์

กรณีการใช้งาน JSONPath

การพัฒนา Frontend
ดึงค่าที่ซ้อนอยู่ที่คุณต้องการจากการตอบสนอง API ก่อนนำไปผูกกับ React state หรือ Vue computed properties ทดสอบนิพจน์ path กับ payload จริงของ API ก่อน
การทดสอบ Backend API
Postman และ REST-assured ใช้ JSONPath ในการยืนยันเนื้อหาการตอบสนอง สร้างและตรวจสอบนิพจน์ assertion ที่นี่ก่อนคัดลอกไปยังสคริปต์ทดสอบ เพื่อลดรอบการแก้ไขบัก
การกำหนดค่า DevOps
Kubernetes custom resource definitions, AWS Step Functions และแหล่งข้อมูล Terraform รับนิพจน์ JSONPath เพื่อดึงค่าจากผลลัพธ์ JSON ตรวจสอบ path ของคุณก่อน deploy
QA Test Automation
เขียน assertion ที่ใช้ JSONPath สำหรับ contract tests และ integration tests ตรวจสอบว่านิพจน์ของคุณตรงกับค่าที่คาดหวังได้อย่างถูกต้องเมื่อโครงสร้าง JSON มีฟิลด์ที่เป็น optional หรือ nullable
การดึงข้อมูลใน Data Pipeline
Apache NiFi, Logstash และสคริปต์ ETL แบบกำหนดเองใช้ JSONPath เพื่อดึงฟิลด์จากข้อมูล log กึ่งโครงสร้างและ event streams ทดสอบนิพจน์กับ payload ตัวอย่างก่อน deploy pipeline
การเรียนรู้และทดลอง
นักศึกษาและนักพัฒนาที่ยังใหม่กับ JSONPath สามารถลองนิพจน์ต่าง ๆ กับ JSON ตัวอย่างเพื่อทำความเข้าใจวิธีการทำงานของ wildcards, recursive descent และตัวกรอง โดยไม่ต้องมีสภาพแวดล้อมในเครื่อง

อ้างอิงไวยากรณ์ JSONPath

RFC 9535 กำหนดไวยากรณ์มาตรฐาน JSONPath ตารางด้านล่างครอบคลุมตัวดำเนินการที่คุณจะใช้ในคิวรีส่วนใหญ่ ทุกนิพจน์เริ่มต้นด้วย $ (โหนดราก) และต่อตัวเลือกหนึ่งตัวหรือมากกว่าเพื่อนำทางในโครงสร้างเอกสาร

ตัวดำเนินการคำอธิบายตัวอย่าง
$Root element$.store
.keyChild property$.store.book
[n]Array index (zero-based)$.store.book[0]
[*]All elements in array/object$.store.book[*]
..Recursive descent$..author
[start:end]Array slice$.store.book[0:2]
[?()]Filter expression$.store.book[?(@.price<10)]
@Current node (inside filter)$.store.book[?(@.isbn)]

JSONPath เทียบกับ jq และ XPath

JSONPath, jq และ XPath แก้ปัญหาเดียวกัน (การคิวรีข้อมูลที่มีโครงสร้าง) สำหรับรูปแบบและกรณีการใช้งานที่แตกต่างกัน JSONPath มุ่งเป้าที่ JSON และพร้อมใช้งานเป็นไลบรารีในภาษาส่วนใหญ่ jq คือเครื่องมือ CLI แบบ standalone ที่มีภาษาตัวกรอง Turing-complete เป็นของตนเอง XPath ทำงานบน XML และเป็นส่วนหนึ่งของสแตกข้อกำหนด W3C

คุณสมบัติJSONPathjqXPath
รูปแบบข้อมูลJSONJSONXML
เข้าถึงองค์ประกอบแรก$.store.book[0].store.book[0]/store/book[1]
การค้นหาแบบ recursive$..price.. | .price?//price
นิพจน์ตัวกรอง[?(@.price<10)]select(.price < 10)[price<10]
ข้อกำหนดRFC 9535stedolan.github.ioW3C XPath 3.1

ตัวอย่างโค้ด

วิธีประเมินนิพจน์ JSONPath ในภาษาและเครื่องมือยอดนิยม ทุกตัวอย่างใช้โครงสร้าง JSON ร้านหนังสือเดียวกันเพื่อการเปรียบเทียบ

JavaScript (jsonpath-plus)
import { JSONPath } from 'jsonpath-plus';

const data = {
  store: {
    book: [
      { title: 'Moby Dick', price: 8.99 },
      { title: 'The Great Gatsby', price: 12.99 }
    ]
  }
};

// Get all book titles
JSONPath({ path: '$.store.book[*].title', json: data });
// → ['Moby Dick', 'The Great Gatsby']

// Recursive descent — find every price in the document
JSONPath({ path: '$..price', json: data });
// → [8.99, 12.99]

// Filter — books under $10
JSONPath({ path: '$.store.book[?(@.price < 10)]', json: data });
// → [{ title: 'Moby Dick', price: 8.99 }]
Python (jsonpath-ng)
from jsonpath_ng.ext import parse
import json

data = {
    "store": {
        "book": [
            {"title": "Moby Dick", "price": 8.99},
            {"title": "The Great Gatsby", "price": 12.99}
        ]
    }
}

# Get all book titles
expr = parse("$.store.book[*].title")
titles = [match.value for match in expr.find(data)]
# → ['Moby Dick', 'The Great Gatsby']

# Recursive descent — all prices
expr = parse("$..price")
prices = [match.value for match in expr.find(data)]
# → [8.99, 12.99]

# Filter — books under $10
expr = parse("$.store.book[?price < 10]")
cheap = [match.value for match in expr.find(data)]
# → [{"title": "Moby Dick", "price": 8.99}]
Go (ohler55/ojg)
package main

import (
    "fmt"
    "github.com/ohler55/ojg/jp"
    "github.com/ohler55/ojg/oj"
)

func main() {
    src := `{
        "store": {
            "book": [
                {"title": "Moby Dick", "price": 8.99},
                {"title": "The Great Gatsby", "price": 12.99}
            ]
        }
    }`

    obj, _ := oj.ParseString(src)

    // Get all book titles
    expr, _ := jp.ParseString("$.store.book[*].title")
    results := expr.Get(obj)
    fmt.Println(results)
    // → [Moby Dick The Great Gatsby]

    // Recursive descent — all prices
    expr2, _ := jp.ParseString("$..price")
    fmt.Println(expr2.Get(obj))
    // → [8.99 12.99]
}
CLI (jq alternative syntax)
# jq uses its own syntax, not JSONPath, but solves the same problem.
# Mapping common JSONPath patterns to jq:

# $.store.book[*].title → get all titles
echo '{"store":{"book":[{"title":"Moby Dick"},{"title":"Gatsby"}]}}' | \
  jq '.store.book[].title'
# → "Moby Dick"
# → "Gatsby"

# $..price → recursive descent for "price" keys
echo '{"a":{"price":1},"b":{"price":2}}' | \
  jq '.. | .price? // empty'
# → 1
# → 2

# Filter: books where price < 10
echo '{"store":{"book":[{"title":"A","price":8},{"title":"B","price":12}]}}' | \
  jq '.store.book[] | select(.price < 10)'
# → {"title":"A","price":8}

คำถามที่พบบ่อย

JSONPath กับ jq ต่างกันอย่างไร?
JSONPath คือภาษาคิวรีที่ออกแบบมาเพื่อฝังในแอปพลิเคชันในรูปแบบไลบรารี โดยจะคืนค่าที่ตรงกันจากเอกสาร JSON โดยใช้นิพจน์ path jq คือเครื่องมือ command-line แบบ standalone ที่มีภาษาโปรแกรมเต็มรูปแบบสำหรับแปลง JSON รวมถึง conditionals ฟังก์ชัน และการแทนที่สตริง ใช้ JSONPath เมื่อคุณต้องการคิวรีที่ฝังอยู่ในโค้ดหรือเครื่องมืออย่าง Postman ใช้ jq สำหรับการแปลงข้อมูลแบบ ad-hoc บน command line
JSONPath เป็นมาตรฐานอย่างเป็นทางการหรือไม่?
ใช่ IETF เผยแพร่ RFC 9535 ("JSONPath: Query Expressions for JSON") ในเดือนกุมภาพันธ์ 2024 ก่อนหน้านั้น JSONPath มีอยู่เพียงในรูปข้อกำหนดที่ไม่เป็นทางการของ Stefan Goessner จากปี 2007 ซึ่งนำไปสู่ความไม่สอดคล้องกันระหว่างการ implement ต่าง ๆ RFC 9535 กำหนดไวยากรณ์ ความหมาย และรูปแบบการทำให้ปกติสำหรับความสามารถในการทำงานร่วมกัน
recursive descent (..) ทำงานอย่างไรใน JSONPath?
ตัวดำเนินการ recursive descent (..) ค้นหาทุกระดับของเอกสาร JSON สำหรับคีย์ที่ตามมา ตัวอย่างเช่น $..price คืนค่าทั้งหมดที่เกี่ยวข้องกับคีย์ "price" โดยไม่คำนึงว่าซ้อนอยู่ลึกแค่ไหน เทียบเท่ากับการสำรวจแบบ depth-first ที่รวบรวมโหนดที่ตรงกัน โปรดทราบว่าในเอกสารขนาดใหญ่ recursive descent อาจคืนผลลัพธ์จำนวนมากและอาจช้ากว่า path โดยตรง
JSONPath สามารถแก้ไขข้อมูล JSON ได้หรือไม่?
ไม่ได้ JSONPath เป็นภาษาคิวรีแบบอ่านอย่างเดียว มันเลือกและคืนค่าแต่ไม่สามารถแทรก อัปเดต หรือลบโหนดได้ ในการแก้ไข JSON ตามนิพจน์ JSONPath คุณต้องใช้ฟังก์ชันจัดการ JSON ของภาษาโปรแกรมหลังจากคิวรี ไลบรารีบางตัวเช่น jsonpath-ng ใน Python มีเมธอด set() บนออบเจกต์ match แต่นี่เป็นส่วนขยายของไลบรารี ไม่ใช่ส่วนหนึ่งของข้อกำหนด JSONPath
สัญลักษณ์ @ ใน JSONPath filter expressions หมายความว่าอะไร?
สัญลักษณ์ @ อ้างถึงโหนดปัจจุบันที่ถูกประเมินในนิพจน์ตัวกรอง ใน $.store.book[?(@.price < 10)] ตัวกรองจะวนซ้ำในแต่ละองค์ประกอบของอาร์เรย์ book และ @ แทนออบเจกต์ book แต่ละรายการ @.price เข้าถึงฟิลด์ price ของ book ปัจจุบัน หากไม่มี @ ตัวกรองจะไม่รู้ว่าต้องตรวจสอบ properties ของโหนดใด
ฉันจะจัดการคีย์ที่มีอักขระพิเศษหรือช่องว่างใน JSONPath อย่างไร?
ใช้ bracket notation พร้อมเครื่องหมายคำพูด: $['store']['book title'] Bracket notation ใช้ได้กับทุกคีย์ รวมถึงคีย์ที่มีจุด ช่องว่าง หรืออักขระ Unicode Dot notation ($.store.key) ใช้ได้เฉพาะกับคีย์ที่เป็น valid identifiers (ตัวอักษร ตัวเลข ขีดล่าง) RFC 9535 กำหนดให้ implementations รองรับทั้ง single-quoted และ double-quoted bracket notation
ทำไมนิพจน์ JSONPath ของฉันถึงคืนผลลัพธ์ว่างเปล่า?
สาเหตุที่พบบ่อยที่สุดคือ: พิมพ์ชื่อคีย์ผิด (JSONPath คำนึงถึงตัวพิมพ์เล็ก-ใหญ่) ใช้ dot notation กับคีย์ที่มีอักขระพิเศษ ลืมใส่สัญลักษณ์ $ ที่จุดเริ่มต้น หรือสมมติว่าค่าเป็นอาร์เรย์แต่จริง ๆ เป็นออบเจกต์เดียว วาง JSON ลงในเครื่องมือทดสอบแล้วลองใช้นิพจน์ย่อยที่ง่ายกว่าก่อน (เช่น $.store) เพื่อยืนยันว่าแต่ละส่วนของ path ถูกต้องก่อนเพิ่มตัวเลือกเพิ่มเติม