JSON Toolkit

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.

Menengah±11 menit bacaDiterbitkan 2026-10-30Diperbarui 2026-10-30
Sampul artikel perbandingan pustaka parsing dan pemrosesan JSON

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:

  1. Bagaimana kunci duplikat ditangani (pertahankan yang terakhir / munculkan error);
  2. Apakah bilangan bulat besar kehilangan presisi (sebagian besar pustaka JS mengalami ini, karena semuanya melalui Number);
  3. 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-parser sangat kecil dan cocok untuk bundle utama;
  • json5 sedikit lebih besar daripada jsonc-parser karena mendukung lebih banyak sintaks;
  • jsonpath-plus menyertakan evaluasi ekspresi dan jelas lebih besar, sehingga harus dimuat secara lazy per halaman;
  • fast-json-patch berukuran 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-parser ketika 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.