Alat pengembang · JSON pemformat & validator
Mengapa file baris JSON gagal validasi pada baris 2, kolom 1
· Cara kerjanya
json alur kerja pengembang validasi
File .jsonl terdiri dari banyak dokumen JSON, bukan hanya satu, sehingga validator yang ketat berhenti tepat di tempat yang kedua dimulai. Postingan ini menjelaskan garis JSON dan konvensi NDJSON serta cara memvalidasinya satu per satu.
Valid di setiap baris, tidak valid sebagai file
Valid di setiap baris, tidak valid sebagai file — ekspor yang dibaca dengan senang hati oleh setiap alat downstream tetapi ditolak oleh validator di baris kedua. Pengirim log dapat menggunakan setiap baris baru sebagai batas catatan, namun parser JSON yang ketat melihat seluruh file sebagai satu masukan. Objek pertama selesai JSON; kurung kurawal pembuka berikutnya adalah nilai akar kedua yang ilegal.
ToolAcre memvalidasi satu teks JSON, bukan JSON Baris. Setelah pemindai menyelesaikan nilai akar pertama, karakter non-spasi berikutnya dilaporkan sebagai tidak terduga setelah nilai JSON berakhir. Itu tidak menawarkan validasi atau konversi NDJSON per baris sebagai cadangan tersembunyi. Perbedaan tersebut mencegah hasil berwarna hijau yang menyiratkan bahwa setiap rekaman dalam aliran berorientasi garis telah diperiksa.
Satu teks, satu nilai — apa yang RFC 8259 definisikan sebagai teks JSON dan mengapa dua nilai tingkat atas berturut-turut merupakan kesalahan tata bahasa
Satu teks, satu nilai — apa yang RFC 8259 definisikan sebagai teks JSON dan mengapa dua nilai tingkat atas berturut-turut merupakan kesalahan tata bahasa. Teks JSON adalah nilai serial, sehingga objek, array, string, angka, boolean, atau null dapat berdiri di root. Spasi putih mungkin mengelilingi nilai tersebut, namun tidak dapat memisahkan beberapa akar menjadi dokumen valid yang lebih besar.
Misalnya, `{"ok":true} {"ok":false}` berisi dua objek yang masing-masing valid, tetapi bukan satu teks JSON. Mengurai objek pertama akan menghabiskan satu nilai lengkap; penguraian seluruh string kemudian harus menolak `{` kedua. Untuk merepresentasikan kedua nilai dalam JSON biasa, letakkan keduanya di dalam array dan tambahkan koma yang diperlukan di antara elemen array.
JSON Garis dan NDJSON
JSON Garis dan NDJSON — konvensi yang dibatasi baris baru, alasan keberadaannya untuk streaming dan log, dan perbedaannya dengan larik JSON. Setiap baris fisik membawa satu nilai JSON lengkap, biasanya sebuah objek, dan baris baru bertindak sebagai pembingkaian di luar tata bahasa JSON. Produsen dapat menambahkan catatan dan konsumen dapat memprosesnya secara bertahap tanpa memuat koleksi lengkap.
Sebaliknya, sebuah array memiliki satu tanda kurung buka, elemen yang dipisahkan koma, dan satu tanda kurung tutup, menjadikan seluruh file memiliki nilai JSON tunggal. Hal ini berguna untuk API yang mengembalikan koleksi terbatas tetapi tidak nyaman untuk aliran peristiwa yang berkembang tanpa batas. File baris JSON yang terpotong dapat menyimpan semua catatan lengkap sebelumnya; array yang terpotong biasanya membiarkan nilai terlampirnya belum selesai.
Kenapa error selalu di baris 2, kolom 1
Mengapa kesalahan selalu di baris 2, kolom 1 — parser menyelesaikan nilai pertama, mengharapkan akhir masukan, dan memenuhi karakter pertama dari catatan kedua. Baris baru itu sendiri legal di belakang spasi, sehingga tidak memicu kegagalan. Kurung pembuka rekor berikutnya adalah token pertama yang bertentangan dengan status dokumen lengkap.
Lokasi tersebut merupakan bukti diagnostik dan bukan klaim bahwa objek kedua memiliki format yang salah. Jika laporan secara konsisten menunjuk ke karakter non-spasi pertama setelah akar yang valid, periksa bentuk file sebelum mengedit tanda baca. Menghapus kurung kurawal akan merusak catatan; memilih pembaca yang sadar garis atau mengubah catatan menjadi array mengatasi ketidakcocokan framing yang sebenarnya.
Contoh praktis: memvalidasi tiga catatan log
Contoh praktis: memvalidasi tiga catatan log — memeriksa setiap barisnya sendiri dibandingkan membungkusnya dalam array dengan koma. Misalkan baris tersebut berisi `{"level":"info"}`, `{"level":"warn"}` dan `{"level":"error"}`. Validator berorientasi garis mengurai tiga masukan terpisah dan dapat mengidentifikasi catatan yang tepat jika ada tanda kutip yang hilang atau koma di akhir.
Untuk pemeriksaan seluruh dokumen yang ketat, ubah sampel menjadi `[{"level":"info"},{"level":"warn"},{"level":"error"}]`. Tanda kurung membentuk satu akar kata dan koma membatasi elemen-elemennya. Jangan hanya mengganti baris baru dengan koma: ini menghasilkan tiga akar kata yang dipisahkan oleh tanda baca kecuali jika array di sekitarnya ditambahkan, dan baris baru tersebut dapat salah menangani baris kosong yang mungkin dilarang atau diabaikan oleh konvensi sumber.
Mengonversi antara dua bentuk
Mengonversi antara dua bentuk — kapan array pembungkus sesuai dan kapan akan mengalahkan titik keluaran yang dibatasi garis. Ekspor terbatas yang ditujukan untuk permintaan API, editor, atau validator ketat sering kali dapat menjadi array. Konversi harus mengurai setiap catatan terlebih dahulu, karena penggabungan tekstual tidak dapat dengan aman memperhitungkan karakter escape yang tertanam atau baris yang tidak valid.
Simpan JSON Baris ketika catatan tiba terus-menerus, file ditambahkan, atau konsumen memerlukan memori terbatas dan pemulihan tingkat catatan. Mengonversi aliran peristiwa multi-gigabita menjadi satu larik memerlukan mempertahankan status penampung dan menunda penguraian lengkap hingga tanda kurung tutup tiba. Di arah lain, buat cerita bersambung setiap elemen array secara kompak pada satu baris dan tentukan apakah baris kosong atau baris baru terakhir diperbolehkan.
Hal ini tidak tercakup dalam hal ini
Apa yang tidak tercakup di sini — gabungan JSON tanpa baris baru dan pembingkaian pemisah rekaman (RFC 7464), yang memerlukan parser khusus. Nilai-nilai yang ditempatkan secara langsung bersama-sama tidak dapat dipisahkan secara aman dengan operasi garis sederhana, terutama jika akarnya dapat berupa angka atau string. RFC 7464 menggunakan karakter pemisah rekaman ASCII untuk membingkai urutan teks JSON daripada hanya mengandalkan baris baru yang terlihat.
Itu juga tidak memvalidasi aturan aplikasi yang dibagikan oleh catatan. Mengurai setiap baris tidak dapat membuktikan stempel waktu diurutkan, pengidentifikasi unik, atau semua objek menggunakan skema yang sama. Pemeriksaan tersebut dilakukan setelah pembingkaian catatan dan penguraian sintaksis. Demikian pula, baris baru disematkan sebagai escape sequence ` ` di dalam string terdapat data, bukan batas fisik, dan pembaca garis yang patuh harus menjaga perbedaan tersebut.
Kesimpulan: ketahui bentuk apa yang Anda pegang
Kesimpulan: ketahui bentuk mana yang Anda pegang — dan bagaimana posisi validator memberi tahu Anda secara instan bahwa suatu file dibatasi garis. Kegagalan pada token pertama dari baris kedua setelah nilai baris-satu yang lengkap sangat menunjukkan beberapa rekaman berbingkai, bukan sintaksis yang rusak pada rekaman pertama. Periksa ekstensi, dokumentasi produsen dan konsumen yang diharapkan sebelum mengubah data.
Gunakan parser JSON Baris atau NDJSON untuk memvalidasi catatan secara independen ketika baris baru tersebut disengaja. Gunakan array ketika tujuan memerlukan satu koleksi JSON lengkap. ToolAcre dengan benar menolak file multi-root karena kontraknya adalah validasi teks tunggal yang ketat; penolakan melindungi kontrak tersebut daripada menunjukkan bahwa JSON yang dibatasi baris baru pada dasarnya rusak. Cocokkan validator dengan format pembingkaian.