Satu item array JSON menjadi satu baris JSONL
Array JSON adalah satu dokumen JSON yang berisi nilai-nilai dipisah koma di dalam kurung siku [ ]. JSONL (JSON Lines) adalah format yang menulis satu nilai JSON per baris dan memisahkannya dengan baris baru. Keduanya dapat memuat daftar yang sama, tetapi cara membacanya berbeda. Array baru selesai dibaca setelah seluruh dokumen sampai kurung siku penutup, sedangkan JSONL dapat dibaca baris demi baris dan dapat ditambah satu baris di bagian akhir. Array pada contoh di atas berisi empat pesanan, jadi hasil konversinya ke JSONL adalah empat baris.
Konverter ini memeriksa apakah teks yang Anda tempel berupa array atau JSONL, lalu menyesuaikan arah konversi secara otomatis. Jika teksnya respons API yang dibungkus objek seperti {"data": [ … ]} dan sudah dirapikan dalam beberapa baris, array di dalamnya dicari dan dikonversi. Respons yang dipadatkan dalam satu baris dibaca sebagai satu baris JSONL, jadi ubah arahnya ke "Array JSON → JSONL". Hasilnya ditampilkan di panel hasil dengan nomor, huruf bentuk, dan batang ukuran untuk tiap baris; tekan sebuah baris untuk membuka nilainya. Pada bagian "Komposisi kunci" di bawah, Anda dapat melihat melalui batang apakah ada kunci yang hilang di suatu item dan apakah nilai pada kunci yang sama bercampur antara angka dan string. Teks dan file yang Anda masukkan tidak dikirim ke server; semuanya diproses hanya di browser ini.
Kapan array JSON dan JSONL perlu saling dikonversi
- Saat membuat file input OpenAI Batch API: pekerjaan batch membaca satu baris file .jsonl sebagai satu permintaan, dan setiap permintaan harus punya custom_id yang berbeda. Satu batch dapat memuat hingga 50.000 permintaan, dan file inputnya maksimum 200 MB. Jika daftar permintaan Anda buat sebagai array, konversikan ke JSONL, lalu pastikan pada komposisi kunci custom_id bertanda "Semua nilai unik".
- Saat memuat data ke data warehouse seperti BigQuery: dokumentasi Google Cloud menyebutkan bahwa JSON yang dimuat harus dipisah baris baru dan setiap objek harus berada dalam satu baris. File array hasil unduhan dari API tidak memenuhi syarat ini jika diunggah apa adanya, jadi konversikan dulu ke JSONL.
- Saat menyerahkan log yang terus ditambah sebagai satu dokumen: log JSONL yang ditambah satu baris demi satu baris harus digabung menjadi array JSON agar dapat diberikan ke program yang membaca satu dokumen JSON, seperti alat grafik atau kode JavaScript.
- Saat memproses data besar secara terpisah: JSONL yang dipotong berdasarkan jumlah baris tetap berupa JSONL di setiap potongan. Pada array, kurung siku dan koma menjadi tidak cocok di titik potong sehingga tiap potongan perlu diperbaiki, jadi JSONL lebih praktis untuk data yang dikirim atau diproses per bagian.
Aturan konversi
- Array JSON → JSONL: satu baris ditulis untuk setiap item pada array terluar. Hanya spasi dan baris baru di luar string yang dibuang; penulisan angka, escape, dan urutan kunci dibiarkan seperti aslinya. Akhir baris adalah LF, dan sesuai anjuran dokumen JSON Lines, LF juga ditambahkan setelah baris terakhir, tanpa BOM. Array kosong [] tidak memiliki item, sehingga hasilnya 0 byte.
- Respons API yang dibungkus: jika bagian terluar berupa objek, array dicari di dalamnya (hingga 3 tingkat kunci, misalnya data.items). Array dengan objek terbanyak dipilih lebih dulu, dan pada "Array yang dikonversi" di bagian atas Anda dapat memilih array lain atau "Seluruh objek jadi satu baris".
- JSONL → array JSON: satu nilai JSON dibaca dari tiap baris dan dimasukkan sebagai item array. Akhir baris CRLF dari Windows juga terbaca. Karena JSON Lines tidak menganggap baris kosong sebagai nilai yang valid, baris kosong dilaporkan sebagai galat. Bentuk array dapat dipilih dari "Indentasi 2 spasi", "Indentasi 4 spasi", "Satu baris per item", dan "Semua dalam satu baris".
- Baca longgar: melewati baris kosong, koma di akhir baris, nilai yang diindentasi di beberapa baris, dan karakter pemisah RS (0x1E), lalu membaca nilai secara berurutan. Spesifikasi NDJSON membolehkan baris kosong diabaikan secara diam-diam, tetapi mensyaratkan perilaku itu didokumentasikan dan dapat diubah lewat pengaturan. Karena itu opsi ini mati secara default, dan saat galat muncul Anda dapat langsung menyalakannya dengan tombol pada kartu galat.
- Deteksi arah otomatis: arah hanya disesuaikan saat Anda menempel teks yang mengganti seluruh isi kolom input atau saat membuka file. Satu array yang diapit kurung siku dan satu objek yang membentang beberapa baris (misalnya respons API yang sudah dirapikan) dianggap array JSON; selain itu, termasuk objek yang ditulis dalam satu baris, dianggap JSONL, karena objek satu baris seperti baris permintaan Batch API adalah satu baris JSONL. Respons API satu baris tanpa pemisah baris juga dibaca sebagai satu baris JSONL, jadi untuk memecah array di dalamnya menjadi baris, ubah arah ke "Array JSON → JSONL". Arah tidak berubah selama Anda mengetik langsung.
- Jenis nilai: JSON Lines mengizinkan bukan hanya objek, tetapi juga angka, string, array, dan null sebagai nilai satu baris. Konverter ini juga memindahkan semua nilai apa adanya, dan jumlah item yang bukan objek dilaporkan terpisah pada komposisi kunci.
Contoh: empat pesanan menjadi empat baris JSONL
Ini hasil konversi array pada layar awal di atas ke JSONL. Ukuran adalah jumlah byte UTF-8 tanpa baris baru, dan bentuk adalah huruf yang sama untuk kombinasi kunci yang sama.
| Baris | Isi JSONL | Ukuran | Bentuk |
|---|---|---|---|
| 1 | {"id":1001,"pelanggan":"Sari","jumlah":2,"tag":["baru","kupon"]} | 64 B | A |
| 2 | {"id":1002,"pelanggan":"Budi","jumlah":1,"catatan":"Taruh di depan pintu\nJangan tekan bel"} | 92 B | B |
| 3 | {"id":1003,"pelanggan":"Dewi","jumlah":3,"tag":[]} | 50 B | A |
| 4 | {"id":1004,"pelanggan":"Agus","jumlah":"2","tag":["langganan"]} | 63 B | A |
Array input beserta indentasi dan spasinya berukuran 316 byte, dan hasil JSONL berukuran 273 byte setelah ditambah empat baris baru. Tulisan \n pada catatan baris ke-2 adalah escape yang ditulis di dalam string, bukan baris baru yang sebenarnya, sehingga seluruh objek tetap berada dalam satu baris. Jika keempat baris yang sama digabung kembali menjadi array JSON, ukurannya berbeda menurut bentuk array seperti berikut.
| Bentuk array | Ukuran | Cocok untuk |
|---|---|---|
| Indentasi 2 spasi | 427 B | Saat struktur diperiksa langsung oleh manusia |
| Indentasi 4 spasi | 533 B | Saat dimasukkan ke repositori kode yang memakai indentasi 4 spasi |
| Satu baris per item | 288 B | Saat ingin melihat hanya item yang berubah sebagai selisih satu baris di version control |
| Semua dalam satu baris | 275 B | Saat mengirim dengan ukuran sekecil mungkin |
Yang perlu diperiksa pada komposisi kunci
- Bentuk A dan B: item dengan kombinasi kunci yang sama diberi huruf yang sama, dan bentuk yang paling banyak adalah A. Pada contoh ini A ada tiga, dan hanya pesanan ke-2 yang punya catatan tanpa tag yang berbentuk B (+catatan −tag). Menekan chip bentuk akan menyorot hanya baris berbentuk itu di panel hasil.
- Batang pada kartu kunci: menampilkan persentase item yang memiliki kunci itu dari seluruh item, serta jenis nilainya (angka, string, boolean dan null, objek dan array). Bagian batang yang kosong adalah item yang tidak punya kunci itu. Menekan kartu yang batangnya kosong akan menyorot baris yang tidak memiliki kunci tersebut.
- Tipe campuran: pada contoh ini jumlah berupa angka di tiga item dan string "2" di satu item. Jika dimuat ke database atau alat analisis yang menetapkan tipe data per kolom, nilai seperti ini bisa menyebabkan galat atau konversi tipe, jadi samakan dulu. null sering bercampur sebagai nilai kosong, sehingga tidak dihitung sebagai campuran.
- Semua nilai unik: diberikan pada kunci yang ada di semua item, bertipe nilai tunggal, dan tidak pernah memiliki nilai kembar. Gunakan untuk memeriksa kunci yang tidak boleh duplikat, seperti id atau custom_id pada Batch API.
- Peringatan: angka di luar rentang bilangan bulat aman, item dengan kunci yang sama dua kali dalam satu objek, dan item yang bukan objek ditampilkan terpisah di bagian atas komposisi kunci.
Kesalahan yang sering terjadi
| Input | Masalahnya | Cara memperbaiki |
|---|---|---|
| JSONL dengan baris kosong di antara baris | Dalam JSON Lines, baris kosong juga dianggap galat. | Hapus baris kosong, atau nyalakan "Baca longgar". |
Koma di akhir baris seperti {"a":1}, | Ini isi array yang disalin apa adanya, sehingga bukan JSONL. | Hapus koma, atau nyalakan "Baca longgar". |
| Objek berindentasi yang membentang beberapa baris, berderet satu per satu | Satu nilai tidak muat seluruhnya dalam satu baris. | Baca dengan "Baca longgar", atau bungkus dengan array lalu konversi dengan "Array JSON → JSONL". |
{'a': 1, 'b': None} | Ini hasil cetak dictionary Python apa adanya. JSON hanya memakai tanda kutip ganda dan null. | Cetak ulang dengan modul json Python. |
[1, 2,] | JSON tidak mengizinkan koma setelah item terakhir. | Hapus koma sebelum kurung penutup. |
| Baris baru atau tab sungguhan di dalam string | JSON mewajibkan karakter kontrol di dalam string ditulis dengan escape (RFC 8259 §7). | Tulis baris baru sebagai \n dan tab sebagai \t. |
{"kode_pos": 0012} | Angka JSON tidak boleh diawali 0. | Tulis sebagai string, seperti "0012". |
NaN, Infinity | Nilai seperti ini tidak ada dalam tata bahasa JSON (RFC 8259 §6). | Ganti dengan null atau string. |
Saat galat muncul, di area hasil ditampilkan baris dan karakter keberapa serta posisi masalah pada baris itu. Tekan "Lihat posisi di input" untuk langsung pindah ke karakter tersebut di kolom input.
Bilangan bulat besar dan kunci kembar dipindahkan apa adanya
Standar JSON menjelaskan bahwa bilangan bulat dalam rentang −(253)+1 sampai (253)−1 terbaca sama di antara program yang berbeda (RFC 8259 §6). Bilangan bulat terbesar yang ditangani JavaScript secara akurat juga 9.007.199.254.740.991. Konverter ini tidak mengubah angka menjadi angka untuk perhitungan, tetapi memindahkan karakter yang tertulis apa adanya, sehingga nomor pesanan di luar rentang itu tidak berubah. Kunci yang sama muncul dua kali dalam satu objek juga tidak dihapus. Namun, program penerima hasil dapat membacanya secara berbeda.
| Nilai input | Hasil konverter ini | Nilai yang dibaca JSON.parse JavaScript |
|---|---|---|
9007199254740993 | 9007199254740993 | 9007199254740992 |
{"id":1,"id":2} | {"id":1,"id":2} | {"id":2} |
1.50e+3 | 1.50e+3 | 1500 |
"é" | "é" | "é" |
Standar JSON menyatakan bahwa perilaku program yang menerima objek dengan nama kembar tidak dapat diprediksi, dan mencatat bahwa banyak implementasi hanya menyisakan pasangan terakhir (RFC 8259 §4). Modul json Python juga memakai nilai terakhir. Karena itu komposisi kunci memberi peringatan tentang jumlah item yang memuat kunci kembar, dan kartu kunci menghitung berdasarkan nilai terakhir. Agar nomor yang panjang tidak berubah di sisi penerima, sebaiknya perlakukan sebagai string, misalnya "9007199254740993".
Spesifikasi JSON Lines dan NDJSON, RFC 8259 dan 7464, panduan OpenAI Batch, dokumentasi BigQuery di Google Cloud, dokumentasi json Python, dan dokumentasi MDN telah diperiksa pada sumber aslinya pada 2026-10-20.
Batasan dan hal yang perlu diperhatikan
- Input dikonversi hingga 5 MB (5.242.880 byte) dan hasil hingga 32 MB. File yang dikompresi dengan gzip (misalnya .jsonl.gz) diekstrak lalu dibaca, dan ukurannya dihitung setelah diekstrak. Untuk data yang lebih besar, jadikan JSONL lalu proses per kelompok baris.
- Panel hasil menampilkan sampai 400 baris pertama, tampilan terbuka sampai 20.000 karakter pertama, kartu kunci sampai 24, dan chip bentuk sampai 8 jenis. Salin dan simpan memuat seluruh hasil.
- Komposisi kunci hanya menghitung kunci terluar dari tiap item. Kunci dari objek di dalam objek tidak dihitung.
- Tingkat bersarang dibaca hingga 512. File dibaca sebagai UTF-8 (BOM di awal dibuang), dan file UTF-16 ber-BOM juga terbaca. File yang disimpan berupa UTF-8 tanpa kompresi dan tanpa BOM.
- JSON text sequence (RFC 7464) yang memisahkan nilai dengan karakter RS hanya dapat dibaca melalui "Baca longgar", dan konverter ini tidak menuliskan format tersebut.
- Konverter ini hanya memeriksa tata bahasa JSON. Kunci (misalnya custom_id) dan tipe data yang diminta program penerima harus Anda periksa di dokumentasi layanan itu.
Sumber
- 01JSON LinesSatu nilai JSON yang valid per baris (semua nilai diizinkan, baris kosong tidak valid), akhir baris '\n' ('\r\n' juga terbaca), baris terakhir sebaiknya diakhiri baris baru, BOM dilarang, ekstensi .jsonl dan .jsonl.gz — dicek 2026-10-20
- 02NDJSON — Spesifikasi Newline Delimited JSONDipisah '\n' atau '\r\n', baris kosong boleh diabaikan secara diam-diam (MAY, harus didokumentasikan dan dapat diatur), media type application/x-ndjson, ekstensi .ndjson
- 03IETF — RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format§4 nama dalam objek sebaiknya unik (SHOULD) dan perilaku saat duplikat tidak dapat diprediksi, §6 bilangan bulat [−(253)+1, (253)−1] interoperabel, Infinity dan NaN tidak diizinkan, §7 escape karakter kontrol, §8.1 BOM
- 04IETF — RFC 7464: JavaScript Object Notation (JSON) Text SequencesSetiap nilai diawali RS (0x1E), media type application/json-seq
- 05OpenAI — Panduan Batch APISatu baris file .jsonl adalah satu permintaan, setiap permintaan punya custom_id unik, maksimum 50.000 permintaan per batch dan file input 200 MB
- 06Google Cloud — Loading JSON data from Cloud Storage (BigQuery)Data JSON dipisah baris baru (ndJSON), satu objek per baris, ndJSON adalah format yang sama dengan JSON Lines
- 07Dokumentasi Python — json: JSON encoder and decoderJika nama yang sama berulang dalam satu objek, hanya nilai dari pasangan nama dan nilai terakhir yang dipakai
- 08MDN — Number.MAX_SAFE_INTEGERBilangan bulat aman terbesar di JavaScript, 253 − 1 = 9.007.199.254.740.991
- 09MDN — JSON.parse()Angka JSON diubah menjadi angka JavaScript dan presisinya bisa hilang; cara mengirim angka besar sebagai string
Pertanyaan yang sering diajukan
Bagaimana cara mengubah array JSON menjadi JSONL?
Tempel array JSON ke kolom input di atas atau buka file, dan kolom hasil langsung menampilkan JSONL dengan satu item per baris. Pindahkan dengan tombol Salin, atau unduh file .jsonl dengan tombol "Simpan JSONL". Jika Anda menempel JSONL, arah berubah menjadi "JSONL → Array JSON" dan isinya digabung menjadi array.
Apakah cukup mengganti ekstensi file JSON menjadi .jsonl?
Tidak. Walaupun ekstensinya diganti, isinya tetap array dengan kurung siku terluar dan koma di antara item. JSONL tidak memakai kurung siku dan menulis satu nilai per baris, jadi item harus dipecah dan ditulis ulang per baris seperti yang dilakukan konverter ini.
Bagaimana jika respons API dibungkus seperti {"data": [...]}?
Respons yang sudah dirapikan (beberapa baris) dapat ditempel apa adanya. Jika bagian terluarnya objek, array dicari di dalamnya (hingga 3 tingkat kunci), dan array dengan objek terbanyak dikonversi ke JSONL. Respons satu baris tanpa pemisah baris dibaca sebagai satu baris JSONL, jadi pilih arah "Array JSON → JSONL". Untuk memakai array lain atau menjadikan seluruh objek satu baris, pilih pada "Array yang dikonversi" di bagian atas.
Apa yang terjadi jika ada baris kosong di tengah JSONL?
Menurut standar JSON Lines, baris kosong juga merupakan galat, jadi nomor barisnya ditampilkan. Hapus baris kosong itu, atau tekan tombol "Baca longgar" pada kartu galat agar baris kosong dilewati dan isinya digabung menjadi array. Satu baris baru setelah baris terakhir bukan galat.
Muncul galat saat saya memasukkan objek yang diindentasi di beberapa baris.
JSONL mengharuskan satu nilai ditulis seluruhnya dalam satu baris, sehingga objek yang diindentasi di beberapa baris menimbulkan galat bahwa nilai belum selesai di baris pertama. Jika "Baca longgar" dinyalakan, nilai dibaca berurutan tanpa memedulikan baris lalu digabung menjadi array; konversikan array itu lagi ke JSONL agar rapi satu baris per item.
Apakah angka atau string yang bukan objek juga bisa menjadi satu baris?
Bisa. JSON Lines mengizinkan bukan hanya objek, tetapi juga angka, string, array, dan null sebagai nilai satu baris, sehingga konverter ini memindahkannya apa adanya. Namun banyak alat hanya menerima objek, jadi jika ada item yang bukan objek, jumlahnya ditampilkan pada komposisi kunci.
Apakah angka panjang atau kunci yang sama tidak berubah?
Tidak berubah. Angka tidak diubah menjadi angka untuk perhitungan, melainkan karakter yang tertulis dipindahkan apa adanya, sehingga bilangan bulat besar seperti 9007199254740993 dan penulisan seperti 1.50e+3 tetap utuh, dan kunci yang muncul dua kali tidak dihapus. Program penerima bisa membulatkan angka besar atau hanya memakai kunci terakhir, sehingga komposisi kunci menampilkan peringatan.
Apakah JSON atau file yang saya masukkan disimpan di server?
Tidak disimpan. Konversi hanya berjalan di browser ini, dan teks serta file yang Anda masukkan tidak dikirim ke server. Isi input juga hilang saat halaman ditutup.