Java - JsonPath
Pendahuluan
Ketika berkaitan dengan transfer data antara sistem, maka kita akan berkomunikasi dengan format data JSON.
Format data JSON ini dalam bentuk teks, mudah diinterpretasi dan juga mudah dibaca.
RFC atau spesifikasi standarnya bisa dilihat di sini
Contoh file JSON :
{
"nama": "Anonim",
"alamat": {
"namaJalan": "Jl. Patriot X No. 5",
"kelurahan": "Anoa 1",
"kecamatan": "Nabati",
"kota": "Omnivora"
},
"pekerjaan": "Pegawai Swasta",
"access": [
"read-data",
"modify-data"
]
}
Contoh diaas sama dengan contoh JSON yang ada di artikel yang lain : Oracle JSON
Bagaimana mengakses data JSON di dalamnya dengan Java ?
Untuk mendapatkan data yang ada di dalam JSON itu seperti nama, alamat.namaJalan, pekerjaan, dll tentunya bisa dilakukan dengan banyak cara :
-
Serialized dan Mapping data JSON tersebut ke object Java, kemudian kita akses sesuai dengan attribute class Java yang terkait. Ini biasanya menggunakan library Jackson, Gson, HikariJSON, Genson, Moshi, dll.
-
Menggunakan JSON Path, yaitu tidak perlu memapping JSON tersebut ke object Java, akan tetapi melakukan penelusuran terhadap data text yang ada di JSON tersebut. Mirip-mirip dengan library XMLPath untuk XML.
Ok sekarang kita fokus ke JSON Path saja ..
JSON Path adalah cara untuk mendapatkan nilai dalam sebuah json hanya dengan memasukkan path, atau urutan hirarki dari letak data di sebuah format JSON.
Penggunaan dan sintaks JSON Path ini sebenarnya standar untuk pemrosesan data yang dipertukarkan.
Library java yang terkenal menggunakan JSON Path adalah Jayway JsonPath.
https://github.com/json-path/JsonPath
versi terakhir 30 Januari 2022 , versi 2.7.0.
Bagaimana menggunakannya ?
- import ke dalam file .pom maven
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.7.0</version>
</dependency>
Penggunaan JsonPath ini mirip dengan penggunaan XPath untuk dokumen XML.
Beberapa ketentuannya adalah sbb :
1. Hirarki paling atas/awal dari documen JSON selalu diacu dengan karakter “$”.
2. Ekspression JsonPath ini dapat menggunakan notasi “.” (titik) atau “[]” (kurung siku)
- Misalkan untuk mendapatkan informasi alamat jalan dari contoh JSON diatas :
$.alamat.namaJalan
- Misalkan untuk mendapatkan informasi hak akses user dari contoh JSON diatas :
$.alamat.access
sama juga dengan
- Misalkan untuk mendapatkan informasi alamat jalan dari contoh JSON diatas :
$[‘alamat’][‘namaJalan’]
- Misalkan untuk mendapatkan informasi hak akses user dari contoh JSON diatas :
$[‘alamat’][‘access’]
3. JsonPath ini mempunyai Operator, Fungsi, dan juga Filter
diantaranya :
Operator | Deskripsi |
---|---|
$ | Elemen root atau hirarki paling atas di JSON |
@ | Node yang sedang di proses |
* | posisi dimana saja, dengan nama dan bilangan dibutuhkan |
.. | posisi dimana saja, dengan nama attribute dibutuhkan |
[?( |
pengecekan terhadap kondisi tertentu, hasilnya harus boolean |
[start:end] | filter data array dari posisi start s/d end |
dll |
Ada beberapa Operator dan fungsi yang lain juga, bisa dilihat di websitenya JsonPath :
https://github.com/json-path/JsonPath
Contoh penggunaannya di Java
Di java, penggunaan library ini cukup mudah.
JSON selalu dianggap sebagai sebuah struktur data String.
Misalnya :
String json = "{\"nama\":\"Anonim\",\"alamat\":{\"namaJalan\":\"Jl. Patriot X No. 5\",\"kelurahan\":\"Anoa 1\",\"kecamatan\":\"Nabati\",\"kota\":\"Omnivora\"},\"pekerjaan\":\"Pegawai Swasta\",\"access\":[\"read-data\",\"modify-data\"]}";
String namaJalan = JsonPath.read(json, "$.alamat.namaJalan");
Kalau misalkan ternyata kita melakukan query lagi dengan Json Path yang berbeda, maka pendekatan diatas kurang bagus, karena setiap memanggil fungsi JsonPath.read(json,xxxx), maka akan dilakukan pembacaan (parsing) terhadap document JSON tadi.
Untuk mencegahnya, kita bisa memakai object ReadContext, yang bisa kita pakai berulang2 untuk mendapatkan data dalam JSON tanpa harus parsing dari awal dokumennya.
Contoh :
String json = "{\"nama\":\"Anonim\",\"alamat\":{\"namaJalan\":\"Jl. Patriot X No. 5\",\"kelurahan\":\"Anoa 1\",\"kecamatan\":\"Nabati\",\"kota\":\"Omnivora\"},\"pekerjaan\":\"Pegawai Swasta\",\"access\":[\"read-data\",\"modify-data\"]}";
ReadContext ctx = JsonPath.parse(json);
String namaJalan = JsonPath.read(json, "$.alamat.namaJalan");
List<String> hakAkses = JsonPath.read(json, "$.alamat.access");