JSONPath atau JSON Pointer
Inti pati: JSON Pointer ialah alamat unik yang boleh anda simpan sebagai kunci; JSONPath ialah bahasa pertanyaan. Menggunakan yang salah merosakkan kemas kini konfigurasi atau mencipta semula JSONPath yang rosak.

Pokoknya: guna JSON Pointer apabila anda perlu membaca, menulis atau menyimpan alamat satu nod (contohnya /server/cors/0), dan JSONPath apabila anda perlu memilih satu set nod mengikut syarat; mana-mana laluan yang disimpan mestilah Pointer, tidak pernah ungkapan.
Tanyakan sama ada anda memerlukan satu nod atau satu set nod.
Dalam satu jadual
| JSON Pointer | JSONPath | |
|---|---|---|
| Sifat | Alamat unik | Ungkapan pertanyaan |
| Sintaks | /a/b/0 |
$.a.b[0], $..price |
| Hasil | Tepat satu nod, atau tiada | Sifar atau lebih nod |
| Boleh disimpan sebagai kunci | Ya, rentetan itu ialah identiti | Tidak, mungkin memadankan banyak |
| Piawaian | RFC 6901 | RFC 9535 (dimuktamadkan 2024) |
JSON Pointer
/server/host -> "127.0.0.1"
/server/cors/0 -> "https://a.com"
/ -> the whole document
Kunci yang mengandungi / atau ~ di-escape: ~0 untuk ~, ~1 untuk /. Nilainya ialah sifat tentu: alamat itu ialah rentetan, jadi ia sesuai untuk lajur pangkalan data, baris log, atau kunci konfigurasi. JSON Patch (RFC 6902) menangani setiap operasi dengan cara ini.
JSONPath
$.store.book[*].author
$..price
$.store.book[?(@.price < 10)]
Lebih dekat dengan WHERE dalam SQL. Ungkapan yang sama mengembalikan sifar, satu atau seratus nod bergantung pada data.
Dua mod kegagalan
Menggunakan JSONPath sebagai kunci konfigurasi. Simpan $.server.port dan suatu hari struktur menjadi tatasusunan; ungkapan itu kini memadankan beberapa port dan logik kemas kini tidak mempunyai cara untuk memilih.
Menggunakan Pointer untuk pemilihan. "Cari setiap nod yang harganya di bawah 10" mustahil dengan pointer. Menulis gelung itu sendiri bermakna membina JSONPath separa.
Bagaimana sistem sebenar membahagikan kerja
- Bacaan konfigurasi, kemas kini medan, patch: Pointer, tetap dan boleh diaudit
- Penerokaan data, pengekstrakan pukal, pelaporan: JSONPath, keunggulan ekspresif dahulu
- Apa-apa yang disimpan: Pointer sahaja, tidak pernah ungkapan
Soalan Lazim
Bagaimana saya harus memilih antara JSON Pointer dan JSONPath?
Tanyakan sama ada anda memerlukan satu nod atau satu set. Guna JSON Pointer untuk membaca atau menulis satu nod tertentu dan untuk menyimpan alamat itu sebagai kunci, kerana pointer itu unik, contohnya /server/cors/0. Guna JSONPath untuk memilih nod mengikut syarat, contohnya $.store.book[?(@.price < 10)].
Mengapa ungkapan JSONPath tidak boleh digunakan sebagai kunci konfigurasi?
Kerana ungkapan itu mungkin memadankan beberapa nod. Simpan $.server.port dan suatu hari struktur menjadi tatasusunan; ungkapan itu kemudian memadankan berbilang port dan logik kemas kini tidak dapat menentukan yang mana untuk diubah. Apa-apa yang disimpan atau diaudit memerlukan Pointer.
Bolehkah JSON Pointer menapis nod mengikut syarat?
Tidak. Pointer hanya melangkah melalui laluan tetap dan tiada cara untuk mengetahui nod mana yang wujud, jadi memilih setiap nod yang harganya di bawah 10 adalah mustahil. Menulis gelung itu sendiri bermakna membina JSONPath separa.