Apakah ada (kira-kira) bahasa SQL atau seperti XQuery untuk query JSON?
Saya sedang memikirkan kumpulan data yang sangat kecil yang memetakan dengan baik ke JSON di mana akan menyenangkan jika menjawab pertanyaan seperti "apa saja semua nilai X di mana Y> 3" atau untuk melakukan operasi tipe SUM / COUNT seperti biasa.
Sebagai contoh yang sepenuhnya dibuat-buat, sesuatu seperti ini:
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(X) WHERE Y > 0 (would equate to 7)
LIST(X) WHERE Y > 0 (would equate to [3,4])
Saya pikir ini akan bekerja baik sisi klien dan sisi server dengan hasil yang dikonversi ke struktur data spesifik bahasa yang sesuai (atau mungkin disimpan sebagai JSON)
Googling cepat menunjukkan bahwa orang-orang telah memikirkannya dan mengimplementasikan beberapa hal ( JAQL ), tetapi sepertinya itu bukan penggunaan standar atau sekumpulan perpustakaan yang telah muncul. Sementara setiap fungsi cukup sepele untuk diimplementasikan sendiri, jika seseorang telah melakukannya dengan benar, saya tidak ingin menemukan kembali roda.
Ada saran?
Sunting: Ini mungkin memang ide yang buruk atau JSON mungkin format yang terlalu umum untuk apa yang saya pikirkan .. Alasan menginginkan bahasa query alih-alih hanya melakukan penjumlahan / fungsi-fungsi langsung seperti yang diperlukan adalah bahwa saya berharap untuk membangun pertanyaan secara dinamis berdasarkan input pengguna. Agak suka argumen bahwa "kita tidak perlu SQL, kita bisa menulis fungsi yang kita butuhkan". Akhirnya yang keluar dari tangan atau Anda akhirnya menulis versi SQL Anda sendiri saat Anda mendorongnya semakin jauh. (Oke, saya tahu itu sedikit argumen yang konyol, tetapi Anda mendapatkan idenya ..)
sumber
Jawaban:
Tentu, bagaimana dengan:
Mereka semua tampaknya sedikit bekerja dalam proses, tetapi bekerja sampai batas tertentu. Mereka juga mirip dengan XPath dan XQuery secara konseptual; meskipun XML dan JSON memiliki model konseptual yang berbeda (hierarkis vs objek / struct).
EDIT Sep-2015: Sebenarnya sekarang ada standar JSON Pointer yang memungkinkan traversal konten JSON yang sangat sederhana dan efisien. Ini tidak hanya ditentukan secara formal, tetapi juga didukung oleh banyak perpustakaan JSON. Jadi saya akan menyebutnya standar nyata yang sangat berguna, meskipun karena ekspresifitasnya yang terbatas, itu mungkin atau mungkin tidak dianggap Bahasa Query per se.
sumber
Saya akan merekomendasikan proyek saya yang sedang saya kerjakan bernama jLinq . Saya mencari umpan balik sehingga saya tertarik mendengar pendapat Anda.
Jika memungkinkan Anda menulis kueri yang mirip dengan yang Anda lakukan di LINQ ...
Ini sepenuhnya dapat diperpanjang juga!
Dokumentasinya masih dalam proses, tetapi Anda masih dapat mencobanya secara online.
sumber
Pembaruan: XQuery 3.1 dapat meminta XML atau JSON - atau keduanya bersamaan. Dan XPath 3.1 juga bisa.
Daftar ini terus bertambah:
sumber
jmespath bekerja sangat mudah dan baik, http://jmespath.org/ Ini sedang digunakan oleh Amazon di antarmuka baris perintah AWS, jadi itu harus cukup stabil.
sumber
jmespath
untuk--query
parameter, tetapi merekomendasikanjq
untuk pemipaan baris perintah. docs.aws.amazon.com/cli/latest/userguide/…JQ adalah J SON q bahasa uery, terutama ditujukan untuk baris perintah tapi dengan binding untuk berbagai bahasa pemrograman (Java, node.js, php, ...) dan bahkan tersedia dalam browser melalui JQ-web .
Berikut adalah beberapa ilustrasi berdasarkan pertanyaan awal, yang memberikan JSON ini sebagai contoh:
sintaks jq memperluas sintaks JSON
Setiap ekspresi JSON adalah ekspresi jq yang valid, dan ekspresi seperti
[1, (1+1)]
dan {"a": (1 + 1)} `menggambarkan bagaimana jq memperluas sintaks JSON.Contoh yang lebih berguna adalah ekspresi jq:
yang, diberi nilai JSON
{"a":1, "b":2, "c": 3}
, dievaluasi menjadi{"a":1, "b":2}
.sumber
Built-in
array.filter()
metode membuat sebagian besar disebut perpustakaan permintaan javascript usangAnda dapat menempatkan sebanyak mungkin kondisi di dalam delegasi seperti yang dapat Anda bayangkan: perbandingan sederhana, dimulai dengan, dll. Saya belum menguji tetapi Anda mungkin bisa menyaring filter juga untuk menanyakan koleksi dalam.
sumber
array.filter()
adalah bagian dari JavaScript, bukan JSON.Jika Anda menggunakan .NET maka Json.NET mendukung kueri LINQ di atas JSON. Posting ini memiliki beberapa contoh. Ini mendukung penyaringan, pemetaan, pengelompokan, dll.
sumber
ObjectPath adalah bahasa query sederhana dan ligthweigth untuk dokumen JSON dari struktur yang kompleks atau tidak dikenal. Ini mirip dengan XPath atau JSONPath, tetapi jauh lebih kuat berkat perhitungan aritmatika tertanam, mekanisme perbandingan, dan fungsi bawaan.
Versi python sudah matang dan digunakan dalam produksi. JS masih dalam versi beta.
Mungkin dalam waktu dekat kami akan menyediakan versi Javascript lengkap. Kami juga ingin mengembangkannya lebih lanjut, sehingga bisa berfungsi sebagai alternatif yang lebih sederhana untuk pertanyaan Mongo.
sumber
Cara lain untuk melihatnya adalah dengan menggunakan mongoDB. Anda dapat menyimpan JSON Anda di mongo dan kemudian menanyakannya melalui sintaks permintaan mongodb.
sumber
OK, postingan ini agak lama, tapi ... jika Anda ingin melakukan query seperti SQL di JSON asli (atau objek JS) pada objek JS, lihat https://github.com/deitch/searchjs
Ini adalah bahasa jsql yang sepenuhnya ditulis dalam JSON, dan implementasi referensi. Anda dapat mengatakan, "Saya ingin menemukan semua objek dalam array yang memiliki nama ===" John "&& age === 25 sebagai:
Searchjs implementasi referensi bekerja di browser serta sebagai paket npm node
Itu juga dapat melakukan hal-hal seperti gabungan kompleks dan negasi (TIDAK). Ini secara asli mengabaikan kasus.
Itu belum melakukan penjumlahan atau penghitungan, tetapi mungkin lebih mudah untuk melakukannya di luar.
sumber
Berikut adalah beberapa pustaka javascript sederhana yang juga akan melakukan trik:
jFunk adalah bahasa permintaan sedang berlangsung, dengan sintaksis yang mirip dengan pemilih CSS / jQuery. Itu tampak menjanjikan, tetapi belum memiliki perkembangan di luar komitmen awal.
(ditambahkan 2014): alat baris perintah jq memiliki sintaks yang rapi, tetapi sayangnya itu adalah pustaka ac. Contoh penggunaan:
< package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'
sumber
Di MongoDB , beginilah cara kerjanya (di mongo shell, ada driver untuk bahasa pilihan Anda).
Tiga perintah pertama memasukkan data ke dalam koleksi Anda. (Mulai saja
mongod
server dan terhubung denganmongo
klien.)Dua proses selanjutnya adalah data.
$match
filter,$group
terapkansum
danlist
, masing-masing.sumber
SpahQL adalah yang paling menjanjikan dan dipikirkan dengan baik dari ini, sejauh yang saya tahu. Saya sarankan untuk mengecek terlebih dahulu.
sumber
Saya baru saja menyelesaikan versi yang dapat dirilis dari JS-lib sisi klien (defiant.js) yang melakukan apa yang Anda cari. Dengan defiant.js, Anda dapat meminta struktur JSON dengan ekspresi XPath yang Anda kenal (tidak ada ekspresi sintaksis baru seperti pada JSONPath).
Contoh cara kerjanya (lihat di browser di sini http://defiantjs.com/defiant.js/demo/sum.avg.htm ):
Seperti yang Anda lihat, DefiantJS memperluas JSON objek global dengan fungsi pencarian dan array yang dikembalikan dikirimkan dengan fungsi agregat. DefiantJS berisi beberapa fungsi lain tetapi itu berada di luar ruang lingkup untuk subjek ini. Siapa pun, Anda dapat menguji lib dengan XPath Evaluator di sisi klien. Saya pikir orang yang tidak terbiasa dengan XPath akan menganggap evaluator ini berguna.
http://defiantjs.com/#xpath_evaluator
Informasi lebih lanjut tentang defiant.js
http://defiantjs.com/
https://github.com/hbi99/defiant.js
Saya harap Anda menemukan itu berguna ... Salam
sumber
Google memiliki proyek yang disebut lovefield ; baru tahu tentang itu, dan itu terlihat menarik, meskipun itu lebih terlibat daripada hanya jatuh di garis bawah atau lodash.
https://github.com/google/lovefield
Entri terbaru yang menarik di ruang ini disebut jinqJs .
http://www.jinqjs.com/
Meninjau secara singkat contoh - contohnya , terlihat menjanjikan, dan dokumen API tampaknya ditulis dengan baik.
sumber
Saya akan mendukung gagasan hanya menggunakan javascript Anda sendiri, tetapi untuk sesuatu yang sedikit lebih canggih Anda mungkin melihat data dojo . Belum pernah menggunakannya tetapi sepertinya itu memberi Anda sekitar jenis antarmuka permintaan yang Anda cari.
sumber
Implementasi Jaql saat ini menargetkan pemrosesan data besar menggunakan cluster Hadoop, jadi mungkin lebih dari yang Anda butuhkan. Namun, ini berjalan dengan mudah tanpa cluster Hadoop (tetapi masih membutuhkan kode Hadoop dan dependensinya untuk dikompilasi, yang sebagian besar termasuk). Implementasi kecil Jaql yang dapat tertanam dalam Javascript dan browser akan menjadi tambahan yang bagus untuk proyek ini.
Contoh Anda di atas mudah ditulis dalam jaql:
Tentu saja, masih banyak lagi. Sebagai contoh:
Jaql dapat diunduh / didiskusikan di http://code.google.com/p/jaql/
sumber
Anda juga dapat menggunakan Underscore.js yang pada dasarnya adalah pustaka swiss-knife untuk memanipulasi koleksi. Menggunakan
_.filter
,_.pluck
,_.reduce
Anda dapat melakukan SQL seperti query.Underscore.js berfungsi baik sisi klien dan sisi server dan merupakan pustaka terkenal.
Anda juga dapat menggunakan Lo-Dash yang merupakan cabang dari Underscore.js dengan kinerja yang lebih baik.
sumber
Bilamana mungkin saya akan menggeser semua query ke backend di server (ke SQL DB atau tipe database asli lainnya). Alasannya adalah karena akan lebih cepat dan lebih dioptimalkan untuk melakukan kueri.
Saya tahu bahwa JSON dapat berdiri sendiri dan mungkin ada +/- untuk memiliki bahasa query tetapi saya tidak dapat melihat keuntungannya jika Anda mengambil data dari backend ke browser, karena sebagian besar kasus penggunaan JSON. Permintaan dan filter di backend untuk mendapatkan data sekecil yang diperlukan.
Jika karena alasan apa pun Anda perlu melakukan query di front-end (kebanyakan di browser) maka saya sarankan hanya menggunakan array.filter (mengapa menemukan sesuatu yang lain?).
Yang mengatakan apa yang saya pikir akan lebih bermanfaat adalah transformasi API untuk json ... mereka lebih berguna karena setelah Anda memiliki data, Anda mungkin ingin menampilkannya dalam beberapa cara. Namun, sekali lagi, Anda dapat melakukan banyak hal ini di server (yang bisa lebih mudah untuk skala) daripada pada klien - JIKA Anda menggunakan server <--> model klien.
Hanya senilai 2 pence saya!
sumber
Lihat https://github.com/niclasko/Cypher.js (catatan: Saya penulisnya)
Ini adalah implementasi Javascript nol-dependensi dari bahasa query basis data grafik Cypher bersama dengan basis data grafik. Ini berjalan di browser (diuji dengan Firefox, Chrome, IE).
Dengan relevansi dengan pertanyaan. Ini dapat digunakan untuk menanyakan titik akhir JSON:
Berikut adalah contoh permintaan dokumen JSON yang kompleks dan melakukan analisis di atasnya:
Contoh permintaan JSON Cypher.js
sumber
PythonQL menawarkan sintaks tertanam yang IMHO adalah perbaikan pada SQL, terutama karena
group
,window
,where
,let
, dll dapat dengan bebas bercampur.Kode ini menunjukkan dua jawaban berbeda untuk pertanyaan Anda, tergantung pada kebutuhan Anda untuk menangani seluruh struktur atau hanya nilainya. Eksekusi memberi Anda hasil yang diharapkan.
sumber
Anda bisa menggunakannya
linq.js
.Ini memungkinkan untuk menggunakan agregasi dan pemilihan dari kumpulan data objek, seperti data struktur lainnya.
sumber