Tools & JSON

Format & Validasi JSON untuk Query

Setiap request body ke Elasticsearch berupa JSON. Satu koma salah tempat bisa menggagalkan seluruh kueri. Panduan ini menunjukkan kesalahan umum, contoh salah vs benar, serta cara memformat dan memvalidasi JSON dengan ?pretty dan jq.

Mengapa JSON Valid Itu Penting

Elasticsearch mem-parse body request sebagai JSON sebelum menjalankan kueri. Bila sintaks rusak, server langsung menolak dengan error seperti:

# contoh error parsing yang sering muncul
{
  "error" : {
    "type" : "x_content_parse_exception",
    "reason" : "Unexpected character (',' (code 44)): expected a value"
  },
  "status" : 400
}
Error 400 Bad Request dengan x_content_parse_exception hampir selalu berarti JSON Anda tidak valid — bukan logika kueri yang salah. Perbaiki sintaks dulu sebelum menyalahkan kueri.

Kesalahan Umum & Perbaikannya

Tiga penyebab terbesar request ditolak. Bandingkan versi salah (kiri) dan benar (kanan).

1. Trailing comma (koma menggantung)

Salah

{
  "query": {
    "match": { "judul": "elastic" },
  }
}

Benar

{
  "query": {
    "match": { "judul": "elastic" }
  }
}

2. Kutip tunggal alih-alih kutip ganda

Salah

{
  'query': {
    'term': { 'status': 'aktif' }
  }
}

Benar

{
  "query": {
    "term": { "status": "aktif" }
  }
}

3. Kunci tanpa tanda kutip

Salah

{
  query: {
    range: { umur: { gte: 18 } }
  }
}

Benar

{
  "query": {
    "range": { "umur": { "gte": 18 } }
  }
}
JSON standar mewajibkan kutip ganda untuk semua string dan kunci, dan melarang koma setelah elemen terakhir. Komentar (// atau /* */) juga tidak diizinkan dalam JSON murni.

Daftar Cepat Kesalahan

GejalaPenyebabPerbaikan
Unexpected character ','Trailing commaHapus koma sebelum } atau ]
Unexpected character '''Kutip tunggalGanti semua ' menjadi "
Unexpected character 'q'Kunci tanpa kutipBungkus kunci dengan kutip ganda
Unexpected end-of-inputKurung tidak seimbangCocokkan setiap { dan [
The bulk request must be terminated by a newlineNDJSON tanpa newline akhirTambahkan baris kosong di akhir file

Memformat Respons dengan ?pretty

Cara termudah membaca respons Elasticsearch adalah menambahkan parameter ?pretty ke URL.

# tanpa pretty: JSON satu baris padat, sulit dibaca
curl -s "localhost:9200/_cluster/health"

# dengan pretty: indentasi rapi
curl -s "localhost:9200/_cluster/health?pretty"
{
  "cluster_name" : "es-prod",
  "status" : "green",
  "number_of_nodes" : 3,
  "active_primary_shards" : 24,
  "active_shards" : 48
}
Gabungkan dengan parameter lain memakai &, misalnya /my-index/_search?pretty&size=5. Untuk _cat API, gunakan ?v (header kolom) dan ?format=json bila ingin output JSON.

Memformat & Memfilter dengan jq

jq adalah pemroses JSON di terminal. Pipakan output curl ke jq untuk format berwarna sekaligus ekstraksi field.

# format seluruh respons
curl -s "localhost:9200/_cat/indices?format=json" | jq

# ambil hanya nama indeks dari array
curl -s "localhost:9200/_cat/indices?format=json" | jq '.[].index'

# ambil status cluster saja
curl -s "localhost:9200/_cluster/health" | jq '.status'

# ambil _source dari hasil pencarian
curl -s "localhost:9200/my-index/_search" \
  -H 'Content-Type: application/json' \
  -d '{ "query": { "match_all": {} } }' | jq '.hits.hits[]._source'
Selalu sertakan header -H 'Content-Type: application/json' saat mengirim body. Tanpa itu, Elasticsearch modern menolak request dengan error 406 Not Acceptable.

NDJSON untuk Bulk API

Endpoint _bulk tidak memakai JSON biasa, melainkan NDJSON (Newline Delimited JSON): satu objek JSON per baris, tanpa pembungkus array.

# setiap pasang baris: aksi lalu dokumen; diakhiri newline
{ "index": { "_index": "produk", "_id": "1" } }
{ "nama": "Kopi", "harga": 25000 }
{ "index": { "_index": "produk", "_id": "2" } }
{ "nama": "Teh", "harga": 15000 }
# kirim file NDJSON ke _bulk
curl -s "localhost:9200/_bulk?pretty" \
  -H 'Content-Type: application/x-ndjson' \
  --data-binary @data.ndjson
Aturan ketat NDJSON: setiap baris harus berupa JSON utuh dalam satu baris (tidak boleh diindentasi multi-baris), dan file wajib diakhiri newline. Gunakan --data-binary, bukan -d, agar curl tidak menghapus newline.
Karena tiap baris satu objek, jangan format file _bulk dengan ?pretty atau jq — itu memecah objek ke banyak baris dan membuat bulk gagal.

Ringkasan

  • JSON wajib pakai kutip ganda untuk kunci dan string, tanpa koma menggantung.
  • Error x_content_parse_exception berarti sintaks JSON rusak, bukan logika kueri.
  • Tambahkan ?pretty agar respons mudah dibaca saat debugging.
  • Pipa ke jq untuk memformat sekaligus memfilter field di terminal.
  • Bulk API memakai NDJSON: satu objek per baris, diakhiri newline, kirim dengan --data-binary.

FAQ Format & Validasi JSON

Mengapa JSON harus valid untuk query Elasticsearch?

Body request Elasticsearch dikirim sebagai JSON. Jika ada kesalahan sintaks sekecil apa pun, server menolak request dengan error parsing seperti "Unexpected character" atau "x_content_parse_exception" sebelum kueri sempat dijalankan. JSON yang valid memastikan kueri Anda diterima dan dieksekusi sesuai maksud.

Apa kesalahan JSON yang paling sering terjadi?

Tiga yang paling umum: trailing comma (koma setelah elemen terakhir), penggunaan kutip tunggal alih-alih kutip ganda, dan kunci objek tanpa tanda kutip. JSON standar mewajibkan kutip ganda untuk semua string dan kunci, serta melarang koma menggantung.

Bagaimana cara membuat respons Elasticsearch mudah dibaca?

Tambahkan parameter ?pretty pada URL request, misalnya GET /_cat/indices?pretty atau GET /my-index/_search?pretty. Elasticsearch akan mengembalikan JSON dengan indentasi rapi sehingga mudah dibaca manusia saat debugging.

Apa itu NDJSON dan kapan dipakai?

NDJSON (Newline Delimited JSON) adalah format satu objek JSON per baris tanpa pembungkus array. Elasticsearch memakainya pada Bulk API (_bulk) dan reindex via file. Setiap baris harus diakhiri newline, termasuk baris terakhir, dan tidak boleh ada baris JSON yang dipecah ke beberapa baris.

Tool apa yang bisa memformat JSON di terminal?

jq adalah tool standar. Pipa output curl ke jq, misalnya curl -s localhost:9200/_cat/indices?format=json | jq, dan JSON akan diformat berwarna dan terindentasi. jq juga bisa memfilter dan mengekstrak field tertentu dari respons.

Pelajari Query DSL Lengkap

Setelah JSON Anda valid, jelajahi katalog contoh Query DSL siap pakai untuk membangun kueri yang tepat.

Buka Contoh Query DSL