Perbandingan Pustaka Parsing dan Pemrosesan JSON
Intinya: API native paling cepat, parser toleran memberi offset. Pilih berdasarkan tiga hal: pelokasian error, apakah teks asli dipertahankan, dan apakah batasannya eksplisit.

Intinya: klasifikasikan kebutuhan terlebih dahulu, lalu bandingkan implementasi — gunakan JSON.parse native untuk nilai yang hanya dibaca, jsonc-parser ketika Anda membutuhkan offset atau harus mempertahankan format asli, dan tambahkan pustaka kueri atau patch hanya di tempat yang diperlukan; muat pustaka besar secara lazy per halaman dan buang yang tidak terpelihara.
Setiap pustaka mengklaim "cepat, kecil, dan lengkap". Yang benar-benar membedakan mereka adalah seberapa banyak informasi yang dapat diberikan ketika ada sesuatu yang salah.
1. Empat kategori berdasarkan tujuan
| Kategori | Pustaka representatif | Yang dipecahkan |
|---|---|---|
| Parsing standar | JSON.parse / JSON.stringify |
Sintaks ↔ objek, mengutamakan kecepatan |
| Parsing toleran + pengeditan | jsonc-parser, json5 |
Input dengan komentar, error presisi hingga offset, modifikasi yang mempertahankan format |
| Kueri | jsonpath-plus, jsonpath |
Memilih node berdasarkan ekspresi |
| Mutasi | fast-json-patch, immer |
Menghasilkan/menerapkan patch, pembaruan immutable |
Identifikasi dulu kategori Anda, lalu bandingkan implementasi konkretnya — jika tidak, mudah menggunakan pustaka kueri untuk melakukan tugas parser.
2. Perbandingan berdampingan
| Pustaka | Pelokasian error | Toleransi (komentar/koma di akhir) | Mempertahankan format asli | Skenario yang cocok |
|---|---|---|---|---|
JSON.parse |
Hanya pesan dan posisi (bergantung mesin) | ✗ | ✗ | Parsing bawaan, data API |
jsonc-parser |
offset presisi + kode error |
✓ | ✓ (modify + applyEdits) |
Editor, file konfigurasi |
json5 |
Informasi baris dan kolom | ✓ (lebih longgar) | ✗ | Membaca konfigurasi JSON5 |
jsonlint |
Informasi baris dan kolom | ✗ | ✗ | Hanya referensi, tidak aktif dipelihara |
jsonpath-plus |
Error sintaks ekspresi | — | — | Kueri berdasarkan ekspresi |
fast-json-patch |
Error tingkat operasi | — | — | Pembuatan dan penerapan patch |
lz-string |
— | — | — | Mengompresi JSON ke dalam URL |
Pesan error JSON.parse sangat bervariasi antar mesin. V8 menghasilkan sesuatu seperti
Unexpected token } in JSON at position 42, tetapi apakah posisinya akurat bergantung pada versi mesin;
jsonc-parser sebaliknya mengembalikan struktur stabil { error, offset, length }, yang cocok untuk penanda editor.
3. Empat titik keputusan utama
3.1 Apakah Anda membutuhkan offset
Jika Anda membangun editor dan ingin "klik error untuk melompat ke baris yang sesuai", Anda harus memiliki offset. Ujiannya sederhana: jika pesan error Anda hanya dapat mencetak "invalid JSON", pengguna harus mencarinya sendiri.
import { parse, printParseErrorCode } from 'jsonc-parser';
const errors: Array<{ error: number; offset: number; length: number }> = [];
parse(text, errors, { allowTrailingComma: true, disallowComments: false });
if (errors.length > 0) {
const firstError = errors[0];
console.error(`${printParseErrorCode(firstError.error)} at offset ${firstError.offset}`);
}
3.2 Apakah Anda perlu mempertahankan teks asli
Hanya membaca nilai → parser apa pun bisa. "Mengubah satu field dan membiarkan semua yang lain persis seperti sebelumnya" → Anda harus menggunakan API bergaya pengeditan, bukan "parse → ubah objek → serialisasi".
Pendekatan terakhir kehilangan: komentar, urutan kunci (pada sebagian implementasi), gaya indentasi, notasi literal angka (1e3 menjadi 1000), dan bentuk escape (\u4e2d menjadi karakter sebenarnya).
3.3 Apakah perilaku batas dieksplisitkan
Sebelum memilih pustaka, periksa dokumentasi untuk tiga hal:
- Bagaimana kunci duplikat ditangani (pertahankan yang terakhir / munculkan error);
- Apakah bilangan bulat besar kehilangan presisi (sebagian besar pustaka JS mengalami ini, karena semuanya melalui
Number); - Cakupan dukungan untuk BOM, komentar, dan koma di akhir.
Jika tidak ada dokumentasi, tulis sampel kecil dan uji sendiri. Itu lebih andal daripada membaca README.
3.4 Status pemeliharaan
Risiko sebuah pustaka JSON bukanlah fitur yang kurang, melainkan pengabaian jangka panjang: tidak ada yang akan merilis patch keamanan (prototype pollution, ReDoS) lagi.
4. Perbandingan dengan bahasa lain
| Bahasa | Pustaka standar / pustaka utama | Perbedaan utama |
|---|---|---|
| JavaScript | JSON.parse |
Semua angka berpresisi ganda |
| TypeScript | Sama seperti di atas + jsonc-parser / zod |
Tipe hanya ada saat kompilasi |
| Go | encoding/json |
float64 secara bawaan, gunakan UseNumber() untuk mempertahankan presisi; json.RawMessage untuk parsing tertunda |
| Java | Jackson / Gson / Moshi | Dengan Jackson, waspadai risiko mengaktifkan default typing |
| Python | json / orjson |
parse_float=Decimal mempertahankan presisi; orjson lebih cepat tetapi tidak mendukung semua tipe |
| Rust | serde_json |
Deserialisasi bertipe kuat; fitur arbitrary_precision mempertahankan presisi |
| C++ | simdjson / RapidJSON | simdjson menargetkan throughput parsing, RapidJSON lebih serbaguna |
Saat bertukar data lintas bahasa, hal yang paling mudah membuat tersandung tetap presisi angka dan format waktu; pemilihan pustaka hanya dapat meredakannya, bukan menghilangkannya.
5. Kombinasi tipikal
Opsi 1: Situs tool (sisi peramban)
Parsing and error location: jsonc-parser
Editor: CodeMirror 6 + @codemirror/lang-json
Query: jsonpath-plus
Patch: fast-json-patch
Share links: lz-string
Ciri khas kombinasi ini adalah semuanya berjalan lokal dan tidak ada data yang diunggah, yang sesuai dengan ekspektasi privasi situs utilitas.
Opsi 2: Gateway API sisi server
Validation: Ajv (compile the schema once, reuse it)
Parsing: native JSON.parse (together with a body size limit)
Deferred parsing of large fields: keep the raw string, parse only when needed
Jangan memasukkan pustaka kueri/patch ke lapisan gateway untuk mengimplementasikan logika bisnis — itu tugas lapisan bisnis.
Opsi 3: CLI dan skrip
Pick fields: jq
Format conversion: yq / dasel
Interactive browsing: jless
Batch validation: ajv-cli
6. Dampak nyata ukuran bundle dan performa
jsonc-parsersangat kecil dan cocok untuk bundle utama;json5sedikit lebih besar daripadajsonc-parserkarena mendukung lebih banyak sintaks;jsonpath-plusmenyertakan evaluasi ekspresi dan jelas lebih besar, sehingga harus dimuat secara lazy per halaman;fast-json-patchberukuran sedang dan hanya dibutuhkan ketika Anda memiliki fitur perbandingan.
Optimisasinya sederhana: impor secara dinamis per halaman, dan jangan menaruhnya di chunk layar pertama.
const { JSONPath } = await import('jsonpath-plus');
7. Checklist
- [ ] Pilih pustaka berdasarkan tujuan; jangan gunakan pustaka kueri untuk parsing;
- [ ] Gunakan
jsonc-parserketika Anda membutuhkan pelokasian error yang presisi; - [ ] Gunakan API bergaya pengeditan ketika komentar dan format harus dipertahankan;
- [ ] Uji ketiga perilaku batas dalam praktik: kunci duplikat, bilangan bulat besar, dan BOM;
- [ ] Pantau status pemeliharaan pustaka dan pemberitahuan keamanannya;
- [ ] Impor pustaka besar secara dinamis sesuai kebutuhan.
FAQ
Bagaimana cara memilih pustaka JSON sesuai ukuran proyek saya?
Alat kecil yang hanya membaca data API dapat tetap menggunakan JSON.parse native. Proyek yang membutuhkan pelokasian error sekelas editor atau harus mempertahankan format asli sebaiknya menggunakan jsonc-parser. Gateway sisi server hanya membutuhkan validasi dan parsing, menyisakan pustaka kueri dan patch untuk lapisan bisnis, sementara skrip CLI dapat langsung menggunakan jq, yq, dan ajv-cli.
Mengapa status pemeliharaan lebih penting daripada jumlah fitur?
Risiko nyata sebuah pustaka JSON adalah pengabaian jangka panjang, bukan fitur yang kurang: tidak ada yang akan merilis patch keamanan untuk prototype pollution atau ReDoS. Betapapun lengkap daftar fiturnya, pustaka yang mandek membuat Anda menambal sendiri. Perlakukan pemeliharaan dan pemberitahuan keamanan sebagai kriteria keras alih-alih membandingkan tabel fitur.
Haruskah saya menggunakan JSON.parse untuk mengubah satu field dan mempertahankan komentar serta indentasi?
Tidak. Melakukan parse, mengubah objek, lalu serialisasi kehilangan komentar, urutan kunci, gaya indentasi, notasi literal angka (1e3 menjadi 1000), dan bentuk escape (\u4e2d menjadi karakter sebenarnya). Mengubah satu field sambil mempertahankan semua yang lain memerlukan API bergaya pengeditan seperti modify dan applyEdits di jsonc-parser.