Mengapa 9007199254740993 menjadi ID berbeda

Membaca JSON ini dengan JSON.parse lalu menulisnya dengan JSON.stringify mengubah digit terakhir id. 1.00 juga menjadi 1 dan 1e3 menjadi 1000. Dua perubahan terakhir mempertahankan nilai angka; perubahan ID kehilangan nilai bilangan bulat asli.

const source = '{"id":9007199254740993,"price":1.00,"scale":1e3}';
JSON.stringify(JSON.parse(source));
// {"id":9007199254740992,"price":1,"scale":1000}

Bilangan bulat aman maksimum JavaScript Number adalah 9007199254740991. Tidak semua bilangan bulat lebih besar dibulatkan, tetapi bilangan berbeda dapat menjadi nilai Number yang sama. Bedakan sintaks angka JSON dari batas presisi parser tertentu.

ECMAScript: Number.MAX_SAFE_INTEGER

RFC 8259 §6: JSON numbers

ID fiktif 9007199254740993 menjadi 9007199254740992 setelah JSON.parse dan JSON.stringify; Moyoutil mempertahankan digit asli.
Diagram buatan kami dari hasil menjalankan kode dengan input fiktif yang sama. Bandingkan digit terakhir. Tidak ada ID pengguna nyata yang dipakai.

Kunci duplikat: sintaks valid tidak menjamin interoperabilitas

Jika mode muncul dua kali dalam satu objek, JSON.parse mengganti nilai sebelumnya dengan nilai terakhir. RFC 8259 menyarankan nama unik dan menjelaskan bahwa program dapat menangani nama duplikat secara berbeda. Jangan menganggap semua parser berperilaku sama.

JSON.stringify(JSON.parse('{"mode":"first","mode":"last"}'));
// {"mode":"last"}

RFC 8259 §4: JSON objects

ECMAScript: ParseJSON

Moyoutil tidak otomatis menghapus kunci duplikat. Mempertahankannya bukan anjuran untuk menggunakannya. Periksa sistem penerima dan kontrak data, lalu selesaikan nama duplikat saat membuat sumber.

Validasi di Moyoutil dengan mempertahankan notasi asli

formatJSON memeriksa sintaks dengan JSON.parse, tetapi membuat output dari token asli, bukan objek hasil penguraian. Bilangan bulat besar, notasi desimal dan eksponen, duplikat serta urutan kunci tetap ada. Byte output bisa berbeda: spasi dan baris baru berubah. Minifikasi tidak menghapus spasi di dalam string.

formatJSON('{"id":9007199254740993,"price":1.00,"scale":1e3}', 0).output
// {"id":9007199254740993,"price":1.00,"scale":1e3}

Simpan sumber asli, tempel ke alat JSON, lalu format atau minifikasi. Bandingkan ID penting dan notasi angka sebelum mengunduh. Mengubah input menghapus hasil lama dan menonaktifkan penyalinan; validasi lagi. Batas input adalah 2MiB UTF-8 dan 128 tingkat nesting.

Validasi sintaks tidak memeriksa aturan bisnis, JSON Schema atau interpretasi server. Mengubah angka menjadi string mengubah tipe; itu bukan perbaikan otomatis. Periksa apakah kontrak data mengizinkan ID teks. Reproduksi masalah dengan data fiktif, bukan kunci rahasia nyata atau informasi pribadi.

Pertanyaan yang Sering Diajukan

Apakah validasi berhasil mempertahankan angka di server lain?

Tidak. Alat mempertahankan notasi output, tetapi server yang menguraikannya menjadi angka menerapkan batas presisi parsernya sendiri.

Apakah minifikasi JSON membuat ZIP?

Tidak. Fitur ini membuat teks JSON dengan mengurangi spasi sintaks dan baris baru yang tidak perlu. Tidak membuat file ZIP.