Saat mencari item dalam array dan hash JSON yang kompleks, seperti:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
Apakah ada beberapa jenis bahasa query yang dapat saya gunakan untuk menemukan item in [0].objects where id = 3
?
javascript
json
xpath
xquery
Naftuli Kay
sumber
sumber
in(...).where(...).select(...)
): hugoware.net/Projects/jLinq .data
yang berisi objek JSON Anda, Anda akan menulis:jsel(data).select("//*[@id=3]")
dan itu akan mengembalikan objek yang berisi kunci id dengan 3.Jawaban:
Yup, itu disebut JSONPath . Sumbernya sekarang ada di GitHub .
Ini juga terintegrasi ke dalam DOJO .
sumber
Saya pikir JSONQuery adalah superset dari JSONPath dan karenanya menggantikannya di dojo . Lalu ada juga RQL .
Dari dokumentasi Dojo:
JSONselect memiliki sudut pandang lain tentang pertanyaan (seperti pemilih CSS, bukan XPath) dan memiliki implementasi JavaScript .
sumber
Alternatif lain yang saya ketahui adalah
HTH.
sumber
Untuk meringkas beberapa opsi saat ini untuk melintasi / memfilter data JSON, dan memberikan beberapa contoh sintaksis ...
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json: select () (lebih terinspirasi oleh penyeleksi CSS)
.automobiles .maker:val("Honda") .model
JSONPath (terinspirasi lebih banyak oleh XPath)
$.automobiles[?(@.maker='Honda')].model
Saya pikir JSPath terlihat paling bagus, jadi saya akan mencoba dan mengintegrasikannya dengan aplikasi AngularJS + CakePHP saya.
(Saya awalnya memposting jawaban ini di utas lain tetapi saya pikir ini akan berguna juga di sini.)
sumber
Cobalah menggunakan JSPath
JSPath adalah bahasa khusus domain (DSL) yang memungkinkan Anda menavigasi dan menemukan data dalam dokumen JSON Anda. Menggunakan JSPath, Anda dapat memilih item JSON untuk mengambil data yang dikandungnya.
JSPath untuk JSON seperti XPath untuk XML.
Ini sangat dioptimalkan untuk Node.js dan browser modern.
sumber
XQuery dapat digunakan untuk permintaan JSON, asalkan prosesor menawarkan dukungan JSON. Ini adalah contoh sederhana bagaimana BaseX dapat digunakan untuk menemukan objek dengan "id" = 1:
sumber
JQ mendefinisikan J SON q bahasa uery yang sangat mirip dengan JSONPath - melihat https://github.com/stedolan/jq/wiki/For-JSONPath-users
Saya akan menganggap ini berarti: menemukan semua objek JSON di bawah kunci yang ditentukan dengan id == 3, di mana pun objek itu berada. Permintaan jq yang sesuai adalah:
dimana "|" adalah pipa-operator (seperti dalam pipa shell perintah), dan di mana segmen ".. | objek" sesuai dengan "di mana pun objek mungkin".
Dasar-dasar jq sebagian besar jelas atau intuitif atau setidaknya cukup sederhana, dan sebagian besar sisanya mudah untuk diambil jika Anda sama sekali akrab dengan pipa shell perintah. FAQ jq memiliki petunjuk untuk tutorial dan sejenisnya.
jq juga seperti SQL yang mendukung operasi CRUD, meskipun prosesor jq tidak pernah menimpa inputnya. jq juga dapat menangani stream entitas JSON.
Dua kriteria lain yang mungkin ingin Anda pertimbangkan dalam menilai bahasa query berorientasi JSON adalah:
sumber
Defiant.js juga terlihat sangat keren, inilah contoh sederhana:
sumber
Json Pointer juga tampaknya semakin mendapat dukungan.
sumber
Jsel luar biasa dan didasarkan pada mesin XPath nyata. Ini memungkinkan Anda untuk membuat ekspresi XPath untuk menemukan semua jenis data JavaScript, bukan hanya objek (string juga).
Anda dapat membuat skema dan pemetaan khusus untuk memberi Anda kontrol penuh atas bagaimana data Anda dapat dilewati oleh mesin XPath. Skema adalah cara mendefinisikan bagaimana elemen, anak-anak, atribut, dan nilai simpul didefinisikan dalam data Anda. Kemudian Anda dapat membuat ekspresi Anda sendiri yang sesuai.
Mengingat Anda memiliki variabel yang dipanggil
data
yang berisi JSON dari pertanyaan, Anda bisa menggunakan jsel untuk menulis:Ini akan mengembalikan simpul apa pun dengan
id
atribut 3. Atribut adalah nilai primitif (string, angka, tanggal, regex) apa pun dalam suatu objek.sumber
ObjectPath adalah bahasa query yang mirip dengan XPath atau JSONPath, tetapi jauh lebih kuat berkat perhitungan aritmatika tertanam, mekanisme perbandingan, dan fungsi bawaan. Lihat sintaks:
Temukan di toko semua sepatu warna merah dan harga kurang dari 50
$ .. sepatu. * [warna "merah" dan harga <50]
sumber
@Naftule - dengan "defiant.js", dimungkinkan untuk menanyakan struktur JSON dengan ekspresi XPath. Periksa evaluator ini untuk mengetahui cara kerjanya:
http://www.defiantjs.com/#xpath_evaluator
Tidak seperti JSONPath, "defiant.js" memberikan dukungan skala penuh dari sintaks kueri - XPath pada struktur JSON.
Kode sumber defiant.js dapat ditemukan di sini:
https://github.com/hbi99/defiant.js
sumber
JMESPath tampaknya sangat populer akhir-akhir ini (pada tahun 2020) dan membahas sejumlah masalah dengan JSONPath. Ini tersedia untuk banyak bahasa.
sumber
Jika Anda seperti saya dan Anda hanya ingin melakukan pencarian berbasis path, tetapi tidak peduli tentang XPath nyata, lodash
_.get()
dapat bekerja. Contoh dari lodash docs:sumber
Coba ini - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
Ini adalah implementasi yang sangat sederhana pada xpath untuk xml yang serupa. Itu namanya jpath.
sumber