Bahasa Indonesia

Apa yang dilakukan konverter sintaksis

JSON, YAML, XML, TOML dan CSV tidak memiliki hal yang sama. Halaman ini menyatakan dengan tepat bagaimana setiap bentuk dipetakan, konversi mana yang merugikan, dan apa yang tidak dilakukan oleh alat tersebut.

Apa yang diubahnya

Sembilan konversi terarah: JSON hingga YAML, YAML hingga JSON, JSON hingga XML, XML hingga JSON, JSON hingga TOML, TOML hingga JSON, YAML hingga TOML, TOML hingga YAML, dan JSON hingga CSV. Semuanya berjalan di tab browser Anda; tidak ada yang diunggah.

Setiap konversi bekerja dengan cara yang sama secara internal: dokumen sumber dibaca menjadi nilai JavaScript biasa, dan nilai tersebut ditulis dalam format target. YAML hingga TOML bukanlah kasus khusus, melainkan YAML pembaca yang diikuti oleh penulis TOML. Itulah sebabnya peringatan di bawah dinyatakan per format, bukan per pasangan — peringatan tentang waktu tanggal TOML berlaku di mana pun TOML muncul.

CSV hanya untuk menulis, dan memang sengaja demikian. Membaca CSV berarti menebak pembatas, dialek kutipan, apakah baris pertama adalah header, dan tipe untuk setiap sel — empat tebakan, yang masing-masing membuat konverter salah menebak. Itu adalah pekerjaan untuk alat yang meminta.

XML: atribut, array, dan aturan yang kami pilih

XML tidak memiliki pemetaan JSON kanonik, sehingga konvensi harus dipilih. Format tersebut terlihat di layar setiap kali XML merupakan salah satu dari dua format, dan format tersebut adalah format berikut.

Atribut menjadi kunci objek yang diawali dengan @. <user id="7"><name>Ada</name></user> dibaca sebagai {"user":{"@id":"7","name":"Ada"}}. Awalan inilah yang menjaga atribut dan elemen turunan dengan nama yang sama agar tidak diciutkan menjadi satu kunci — <user id="7"><id>other</id></user> menjaga keduanya.

Teks di dalam elemen yang juga memiliki atribut atau elemen turunan berada di bawah kunci #teks. Elemen yang hanya berisi teks akan diciutkan ke teks tersebut. Bagian CDATA berada di bawah #cdata, jadi isinya tampak berupa data, bukan markup.

Elemen saudara yang berulang menjadi sebuah array. Nama elemen yang muncul sekali tidak menjadi array — XML tidak memberikan parser cara untuk membedakan "daftar dengan satu item" dari "nilai tunggal", dan tidak ada konverter yang dapat menemukan informasi tersebut. Jika Anda memerlukan bentuk yang stabil, itu adalah argumen untuk skema, bukan untuk konverter yang lebih pintar.

Awalan namespace disimpan secara verbatim: <ns:item> adalah kunci ns:item dan xmlns:ns adalah atribut @xmlns:ns. Tidak ada yang diselesaikan, ditulis ulang, atau dihapus, karena penyelesaian awalan membuang teks yang sebenarnya terdapat dalam dokumen.

Tag yang menutup sendiri dibaca sebagai string kosong. Deklarasi XML, instruksi pemrosesan, dan komentar dihilangkan. Sebaliknya, alat tersebut menulis deklarasinya sendiri dan tidak pernah DOCTYPE.

Penulisan XML, kunci yang bukan merupakan nama elemen XML yang sah — yang diberi spasi, yang diawali dengan angka, yang diawali dengan huruf xml — ditolak dengan nama daripada ditulis ulang secara diam-diam. Elemen yang diganti namanya secara diam-diam menghasilkan dokumen yang tidak memvalidasi apa pun.

Entitas eksternal ditolak, tidak hanya dinonaktifkan

Dokumen XML dapat mendeklarasikan entitas dalam DOCTYPE. Pengurai yang memperluasnya adalah kerentanan XXE: entitas yang dinyatakan SYSTEM "file:///etc/passwd" membaca file lokal, yang menunjuk ke URL membuat permintaan yang dikontrol penyerang, dan rantai entitas internal adalah penolakan layanan "miliar tawa" yang mengubah beberapa ratus byte menjadi gigabyte.

Konverter ini tidak mengonfigurasi parser untuk berhati-hati terhadap DOCTYPE. Ia menolak dokumen apa pun yang berisi satu byte, sebelum parser diberikan satu byte, tanpa opsi untuk menonaktifkan penolakan tersebut. Hal ini menjadikan jaminan sebagai properti kode kita, bukan pengaturan default dependensi — dan perbedaannya menjadi penting, karena perubahan default antar versi dan penolakan kita tercakup dalam pengujian yang memberikan setiap payload XXE standar dan menegaskan bahwa tidak ada yang diambil dan tidak ada yang diperluas.

Biaya praktisnya: dokumen dengan DOCTYPE tidak akan dikonversi di sini meskipun tidak berbahaya. Hapus DOCTYPE jika kontennya milik Anda.

TOML waktu tanggal tidak ada tandingannya di tempat lain

TOML 1.0 memiliki empat tipe temporal dan JSON, YAML dan XML tidak memiliki: tanggal-waktu offset (1979-05-27T07:32:00Z), waktu-tanggal lokal (1979-05-27T07:32:00, tanpa zona, sengaja), tanggal lokal (1979-05-27) dan waktu setempat (07:32:00).

Masing-masing menjadi string RFC 3339 persis seperti yang tertulis, dan konversinya memberi tahu Anda nilai mana yang melakukan hal tersebut dan yang mana dari empat jenis masing-masing string tersebut. Alternatifnya — mengeluarkan satu instan UTC untuk keempatnya — akan memindahkan waktu setempat ke zona yang secara eksplisit ditolak oleh dokumen tersebut, yang merupakan jawaban yang salah dan bukan jawaban yang merugikan.

Mengonversi kembali menghasilkan string yang dikutip, bukan waktu. Oleh karena itu, perjalanan pulang pergi TOML ke JSON ke TOML mengubah jenis nilai tersebut. Tidak ada jalan keluar dari hal ini tanpa menciptakan konvensi yang harus dibagikan oleh alat penerima, dan menciptakan konvensi secara diam-diam akan lebih buruk.

TOML bilangan bulat ditandatangani 64-bit; Angka JSON adalah IEEE-754 ganda. Bilangan bulat yang melewati 2^53 - 1 menjadi string, dengan jalur yang disebutkan dalam peringatan, daripada kehilangan digit terakhirnya karena pembulatan yang tidak akan Anda sadari.

TOML tidak memiliki nol. Kunci null dihilangkan dari output dan diberi nama dalam peringatan; null di dalam array menjadi string kosong, karena menghapusnya akan menggeser setiap indeks selanjutnya. Akar dokumen TOML selalu berupa tabel, jadi array atau nilai kosong di akar ditolak dengan kalimat yang menjelaskan alasannya.

YAML: jangkar, sungai dan masalah Norwegia

YAML dibaca dengan skema terbatas yang hanya dapat menghasilkan string, angka, boolean, null, daftar, dan peta. Tag yang membuat objek arbitrer — !!js/function, !!python/object/apply, !!biner — ditolak, yang merupakan alasan utama mengapa pembatasan ini ada: pemuat yang menghormatinya adalah konstruktor objek arbitrer yang mengenakan pakaian file konfigurasi.

Jangkar dan alias diselesaikan menjadi data berulang. Sebuah dokumen yang melampaui satu juta nilai setelah aliasnya diikuti akan ditolak daripada diizinkan untuk membekukan tab; alias rekursif ditolak mentah-mentah, karena tidak ada format lain di sini yang dapat mengekspresikan sebuah siklus.

Aliran beberapa dokumen yang dipisahkan oleh --- menjadi larik dokumen, dan konversi menyatakan demikian. Tidak ada format lain dalam alat ini yang memiliki aliran, jadi array adalah satu-satunya pemetaan yang jujur.

YAML melarang kunci pemetaan berulang, dan setiap parser menanganinya secara berbeda. Alat ini menyimpan nilai terakhir — aturan yang digunakan JSON.parse — dan memberi tahu Anda hal itu terjadi, dengan posisi pengulangan. Membuang dokumen secara diam-diam akan lebih buruk; diam-diam memilih nilai tanpa mengatakannya akan lebih buruk lagi.

Masalah Norwegia: di YAML 1.1, skalar y, yes, on, no, off yang tidak diberi tanda kutip, dan kode negara NO semuanya menghasilkan boolean, yang merupakan cara daftar kode negara diubah menjadi daftar benar dan salah. Alat ini membaca YAML 1.2, di mana hanya benar dan salah yang merupakan boolean, jadi NO tetap menjadi string NO. Saat ia menulis YAML ia mengutip setiap string yang akan salah dibaca oleh parser 1.1 — 'NO', 'yes', 'on', '1.0', '0755', '2001-12-14' — sehingga output aman untuk dimasukkan ke alat yang belum dipindahkan ke 1.2. Itu membutuhkan beberapa karakter kutipan dan membeli kebenaran.

String yang terlihat seperti angka tetap menggunakan tanda petiknya karena alasan yang sama: "0755" tetap menjadi string dan bukannya menjadi 755, dan "1.0" tetap menjadi string bukannya menjadi 1.

Komentar hilang ke segala arah. JSON, CSV dan yang lainnya tidak punya tempat untuk menyimpannya, dan tidak ada cara untuk menebak ke mana mereka harus kembali.

JSON hingga CSV: perataan, dan tanda kutip yang menghentikan rumus

Sebuah array menjadi baris, satu record per elemen. Objek yang properti tunggalnya menampung larik akan menggunakan larik tersebut sebagai barisnya, karena {"users": [ ... ]} sebagian besar merupakan tabel dengan label — dan konversi menyatakan dengan lantang bahwa ia melakukan hal tersebut. Objek lainnya adalah satu baris. String kosong, angka, atau nol ditolak: persegi panjang memerlukan catatan.

Objek dan larik bertumpuk diratakan menjadi nama kolom bertitik, dengan titik untuk kunci objek dan indeks larik: address.city, tag.0, tag.1. Satu pemisah, satu aturan. Kunci yang sudah berisi titik membuat nama kolomnya menjadi ambigu dengan jalur bersarang; alat ini memperingatkan daripada menciptakan skema escape yang tidak dapat dipahami oleh spreadsheet mana pun.

Kunci disatukan di setiap baris, dalam urutan yang pertama kali dilihat. Baris yang tidak memiliki bidang akan mendapatkan sel kosong, bukan kolom yang digeser, dan konversi memperingatkan bahwa baris tersebut tidak rata. Objek kosong atau array kosong menjadi satu sel kosong di bawah jalurnya sendiri, bukannya menghilang.

Kutipan mengikuti RFC 4180: kolom yang berisi pembatas, tanda kutip ganda, CR atau LF diapit tanda kutip ganda dan tanda kutip yang disematkan ditulis dua kali. Catatan dipisahkan oleh CRLF. Bidang dengan spasi di awal atau di akhir juga diberi tanda kutip, karena spreadsheet akan memangkasnya secara diam-diam. Unicode melewatinya tanpa perubahan, dan tanda urutan byte dapat diawali untuk spreadsheet yang memerlukan seseorang untuk membaca UTF-8.

Suntikan formula lah yang menggigit. Sel yang diawali dengan =, +, -, @, tab, atau gerbong kembali dijalankan sebagai rumus oleh Excel, LibreOffice Calc, dan Google Spreadsheet saat file dibuka. =cmd|'/c calc'!A1 adalah demonstrasi yang dikutip semua orang; =IMPORTXML(...) adalah orang yang diam-diam mengirimkan sheet ke suatu tempat. Konverter yang menulis string seperti itu kata demi kata telah mengubah data Anda menjadi eksekusi kode orang lain, dalam file yang terlihat tidak aktif.

Jadi sel teks yang dimulai dengan salah satu karakter tersebut diawali dengan tanda kutip, yang setiap spreadsheet utama dibaca sebagai "ini adalah teks" dan tidak ditampilkan di dalam sel. Angka dibiarkan saja: angka -5 adalah angka, bukan rumus. Jumlah sel yang lolos dilaporkan, dan pelolosan tersebut dapat dimatikan — dalam hal ini alat akan memberitahukan dengan jelas apa yang baru saja Anda matikan.

CSV tidak dapat membedakan string kosong dari nol. Keduanya menjadi sel kosong, dan konversi menghitung nol sehingga Anda tahu itu terjadi.

Batasan, dan apa yang terjadi jika Anda mencapai batas tersebut

Setiap format memiliki batasan karakter, yang diterapkan bahkan sebelum parser diunduh: 8 juta untuk JSON, 4 juta untuk XML dan untuk sumber CSV, 2 juta untuk YAML dan TOML. Selain itu, alat ini menolak dengan nomor pastinya, bukannya menjadi tab tidak responsif yang kehilangan apa yang Anda tempel.

Output CSV juga dibatasi pada 100,000 baris dan 2,000 kolom, karena array yang sangat bertumpuk menjadi satu kolom per elemen dan beberapa megabyte JSON dapat menjadi tabel yang tidak akan dibuka oleh spreadsheet.

Input kosong dan hanya spasi putih dilaporkan sebagai kosong, bukan diubah menjadi null atau dokumen kosong. Sintaks yang tidak valid dilaporkan dengan satu baris dan satu kolom dalam keempat format yang dapat dibaca.

Parser itu sendiri diunduh hanya ketika konversi membutuhkannya. Membuka toolkit untuk memecahkan kode JWT tidak akan mengambil satupun dari mereka.

Apa yang terjadi pada apa yang Anda tempel

  • Setiap konversi, hash, decode dan diff berjalan di tab browser Anda. Tidak ada masukan yang diunggah, dicatat atau disimpan di server, karena tidak ada server yang terlibat setelah halaman dimuat.
  • Hash berasal dari implementasi Web Crypto milik browser, dan UUID dari generator acak yang aman secara kriptografis. Tidak ada yang melibatkan panggilan jaringan.
  • Tidak ada yang Anda ketikkan yang ditulis ke penyimpanan lokal atau cookie. Memuat ulang halaman akan membuangnya; menutup tab akan membuangnya.
  • Analisis seluruh situs hanya berjalan pada host produksi kanonik yang dikonfigurasi dan diungkapkan dalam Kebijakan Privasi; host lokal dan pratinjau menolaknya. Nilai, token, URL, dan konten file yang ditempelkan dikecualikan dari peristiwa analisis ToolAcre sendiri. Periklanan dinonaktifkan dalam konfigurasi saat ini.
  • Artinya: kunci JWT atau API adalah kredensial aktif. Kebiasaan yang aman adalah jangan pernah menempelkannya ke halaman web yang tidak Anda tulis, betapapun dapat dipercayanya klaim tersebut — termasuk yang ini.

Pertanyaan

Mengapa dokumen XML saya gagal dengan "mendeklarasikan DOCTYPE"?

Karena berisi deklarasi tipe dokumen, dan konverter ini menolak semuanya daripada mempercayai pengaturan parser untuk menangani entitas dengan aman. Hapus DOCTYPE jika kontennya milik Anda. Tidak ada pilihan untuk mengizinkannya.

Mengapa tanggal waktu TOML saya muncul kembali sebagai string yang dikutip?

Karena JSON, YAML dan XML tidak memiliki tipe tanggal. Tanggal waktu diubah menjadi teks RFC 3339 seperti yang tertulis, yang merupakan string dalam setiap format lainnya. Oleh karena itu, mengonversi kembali menghasilkan string, dan alat tersebut memperingatkan Anda saat hal itu terjadi daripada membiarkan Anda mengetahuinya nanti.

Mengapa salah satu sel CSV saya dimulai dengan tanda kutip?

Karena teksnya dimulai dengan =, +, -, @, tab, atau carriage return, dan spreadsheet mengeksekusi sel tersebut sebagai rumus saat file dibuka. Tanda kutip menandai sel sebagai teks; itu bukan bagian dari nilai setelah sel dibaca. Anda dapat menonaktifkan pelolosan tersebut, dan alat tersebut akan memberi tahu Anda apa maksudnya.

Mengapa satu elemen XML yang diulang bukan sebuah array?

Karena XML tidak memberikan cara untuk membedakan daftar satu dari satu nilai. Keduanya ditulis secara identik. Menebak ke arah mana pun akan salah separuhnya, sehingga alat tersebut melaporkan apa yang sebenarnya ada di sana.

Bisakah saya mengubah CSV kembali menjadi JSON di sini?

Tidak. Membaca CSV dengan benar memerlukan penentuan pembatas, dialek kutipan, apakah baris pertama adalah header dan tipe untuk setiap sel. Konverter yang menebak keempatnya salah secara diam-diam, yang merupakan kemungkinan terburuk untuk salah. Gunakan alat CSV yang bertanya.

Mengapa "TIDAK" tidak diubah menjadi salah?

Karena perilaku itu milik YAML 1.1 dan alat ini membaca YAML 1.2, yang hanya benar dan salah yang merupakan boolean. Perilaku 1.1 adalah alasan mengapa kode negara Norwegia menjadi lelucon dalam manajemen konfigurasi. Saat alat menulis YAML, ia mengutip string tersebut sehingga tidak ada pengurai 1.1 di bagian hilir yang dapat salah membacanya.

Keterbatasan

  • CSV ditulis, tidak pernah dibaca. Tidak ada konversi CSV ke JSON di sini, karena pilihan.
  • Komentar hilang ke segala arah, dalam setiap format yang memilikinya.
  • Tanggal waktu TOML menjadi string dalam setiap format lainnya, jadi perjalanan pulang pergi TOML mengubah tipe tersebut. Tidak ada jalan tanpa kerugian.
  • Dokumen XML yang berisi DOCTYPE ditolak mentah-mentah, termasuk dokumen yang tidak berbahaya, dan penolakan tersebut tidak dapat dihentikan.
  • Satu elemen XML yang berulang tidak dapat dibedakan dari elemen yang tidak berulang, jadi XML hingga JSON hingga XML tidak selalu mengembalikan bentuk aslinya.
  • XML konten campuran — teks yang disisipkan dengan elemen turunan — kehilangan posisi teks relatif terhadap turunan, dan tidak dapat bolak-balik.
  • Nilai XML adalah string kecuali inferensi tipe diaktifkan, karena XML tidak mendeklarasikan tipe; dengan kesimpulan pada, "0755" dan "NO" dapat mengalami kesalahan pembacaan yang biasa terjadi.
  • TOML tidak memiliki null: kunci null dihilangkan dari output TOML dan null di dalam array menjadi string kosong.
  • Akar dokumen TOML harus berupa tabel, sehingga array atau skalar JSON tidak dapat dikonversi ke TOML sama sekali.
  • Angka JSON adalah IEEE-754 ganda. Bilangan bulat yang melewati 2^53 dikonversi menjadi string, bukan dibulatkan secara diam-diam, sehingga mengubah tipenya.
  • CSV tidak dapat membedakan string kosong dari null; keduanya ditulis sebagai sel kosong.
  • Perataan CSV menggunakan titik untuk kunci objek dan indeks array, sehingga kunci yang sudah berisi titik menghasilkan nama kolom ambigu yang diperingatkan tetapi tidak lolos.
  • YAML jangkar dan alias diselesaikan, bukan dipertahankan; outputnya tidak memiliki jangkar, dan alias rekursif ditolak karena tidak ada format target yang dapat mengekspresikan sebuah siklus.
  • Masukan dibatasi per format — 8 juta karakter untuk JSON, 4 juta untuk XML, 2 juta untuk YAML dan TOML — dan dokumen berukuran besar akan ditolak daripada diproses secara lambat.
  • Tidak ada apa pun di sini yang memvalidasi skema. Sebuah dokumen dapat dikonversi dengan rapi dan tetap salah sesuai tujuannya.