Bahasa Melayu

Perkara yang dilakukan oleh penukar sintaks

JSON, YAML, XML, TOML dan CSV tidak memegang benda yang sama. Halaman ini menyatakan dengan tepat cara setiap bentuk dipetakan, penukaran mana yang rugi dan perkara yang enggan dilakukan oleh alat itu.

Apa yang ditukarkannya

Sembilan penukaran terarah: JSON kepada YAML, YAML kepada JSON, JSON kepada XML, XML kepada JSON, JSON kepada TOML, TOML kepada JSON, YAML kepada TOML, TOML kepada YAML, dan JSON kepada CSV. Setiap satu berjalan dalam tab pelayar anda; tiada apa yang dimuat naik.

Setiap penukaran berfungsi dengan cara yang sama secara dalaman: dokumen sumber dibaca ke dalam nilai JavaScript biasa dan nilai itu ditulis dalam format sasaran. YAML hingga TOML bukanlah kes istimewa, ia adalah pembaca YAML diikuti oleh penulis TOML. Itulah sebabnya kaveat di bawah dinyatakan mengikut format dan bukannya setiap pasangan — kaveat tentang TOML tarikh masa terpakai di mana-mana sahaja TOML muncul.

CSV ialah tulis sahaja dan sengaja begitu. Membaca CSV bermakna meneka pembatas, dialek petikan, sama ada baris pertama ialah pengepala dan jenis untuk setiap sel — empat tekaan, setiap satunya penukar tersalah senyap. Itu adalah kerja untuk alat yang bertanya.

XML: atribut, tatasusunan dan peraturan yang kami pilih

XML tidak mempunyai pemetaan JSON berkanun, jadi konvensyen terpaksa dipilih. Ia boleh dilihat pada skrin apabila XML ialah salah satu daripada dua format dan ia adalah ini.

Atribut menjadi kunci objek yang diawali dengan @. <user id="7"><name>Ada</name></user> dibaca sebagai {"user":{"@id":"7","name":"Ada"}}. Awalan ialah perkara yang menghalang atribut dan elemen anak dengan nama yang sama daripada runtuh menjadi satu kunci — <user id="7"><id>other</id></user> menyimpan kedua-duanya.

Teks di dalam elemen yang turut mempunyai atribut atau elemen anak berada di bawah #teks utama. Unsur yang tidak mengandungi apa-apa selain teks runtuh ke teks itu. Bahagian CDATA tinggal di bawah #cdata, jadi kandungannya jelas kelihatan data dan bukannya markup.

Elemen adik beradik yang berulang menjadi tatasusunan. Nama elemen yang muncul sekali tidak menjadi tatasusunan — XML tidak memberikan penghurai cara untuk memberitahu "senarai dengan satu item" daripada "nilai tunggal", dan tiada penukar boleh mencipta maklumat itu. Jika anda memerlukan bentuk yang stabil, itu adalah hujah untuk skema, bukan untuk penukar yang lebih bijak.

Awalan ruang nama disimpan secara verbatim: <ns:item> ialah kunci ns:item dan xmlns:ns ialah atribut @xmlns:ns. Tiada apa-apa yang diselesaikan, ditulis semula atau dilucutkan, kerana menyelesaikan awalan membuang teks yang sebenarnya terkandung dalam dokumen itu.

Teg penutup sendiri dibaca sebagai rentetan kosong. Perisytiharan XML, arahan pemprosesan dan ulasan digugurkan. Dengan cara lain, alat itu menulis pengisytiharannya sendiri dan tidak pernah DOCTYPE.

Menulis XML, kunci yang bukan nama elemen XML yang sah — satu dengan ruang, satu bermula dengan digit, satu bermula dengan huruf xml — ditolak dengan nama dan bukannya ditulis semula secara senyap. Elemen yang dinamakan semula secara senyap-senyap menghasilkan dokumen yang mengesahkan tiada apa-apa.

Entiti luaran ditolak, bukan sahaja dilumpuhkan

Dokumen XML boleh mengisytiharkan entiti dalam DOCTYPE. Penghurai yang mengembangkannya ialah kerentanan XXE: entiti yang mengisytiharkan SYSTEM "file:///etc/passwd" membaca fail setempat, satu menunjuk ke arah URL membuat permintaan yang dikawal oleh penyerang, dan rangkaian entiti ketawa dalaman ialah "berbilion-bilion entiti dalaman" gigabait.

Penukar ini tidak mengkonfigurasi parser untuk berhati-hati tentang DOCTYPE. Ia menolak sebarang dokumen yang mengandungi satu, sebelum penghurai diberikan satu bait, tanpa pilihan untuk mematikan penolakan itu. Itu menjadikan jaminan sebagai sifat kod kami dan bukannya tetapan lalai kebergantungan — dan perbezaan itu penting, kerana lalai berubah antara versi dan keengganan kami sendiri dilindungi oleh ujian yang memberinya setiap muatan XXE standard dan menegaskan bahawa tiada apa yang diambil dan tiada apa yang dikembangkan.

Kos praktikal: dokumen dengan DOCTYPE tidak akan ditukar di sini walaupun ia tidak berbahaya. Padamkan DOCTYPE jika kandungannya adalah milik anda.

TOML datetimes tiada setara di tempat lain

TOML 1.0 mempunyai empat jenis temporal dan JSON, YAML dan XML tidak mempunyai: mengimbangi tarikh-masa (1979-05-27T07:32:00Z), tarikh-masa tempatan (1979-05-27T07:32:00, tanpa zon, dengan sengaja), tarikh tempatan (1979-05-27) dan waktu tempatan (07:32:00).

Setiap satu menjadi rentetan RFC 3339 tepat seperti yang ditulis dan penukaran memberitahu anda nilai yang mana ia melakukan itu dan yang mana antara empat jenis setiap satu. Alternatifnya — mengeluarkan satu UTC serta-merta untuk keempat-empatnya — akan mengalihkan waktu tempatan ke dalam zon yang dokumen itu enggan nyatakan secara jelas, yang merupakan jawapan yang salah dan bukannya jawapan yang hilang.

Menukar kembali menghasilkan rentetan yang disebut, bukan tarikh. Oleh itu, TOML kepada JSON kepada TOML pergi dan balik mengubah jenis nilai tersebut. Tidak ada cara untuk mengatasi ini tanpa mencipta konvensyen yang alat penerima perlu berkongsi, dan mencipta satu secara senyap akan menjadi lebih teruk.

TOML integer ditandatangani 64-bit; JSON nombor ialah IEEE-754 beregu. Integer melepasi 2^53 - 1 menjadi rentetan, dengan laluan dinamakan dalam amaran, dan bukannya kehilangan digit terakhirnya kepada pembundaran yang anda tidak akan perasan.

TOML tidak mempunyai null. Kunci nol ditinggalkan daripada output dan dinamakan dalam amaran; nol di dalam tatasusunan menjadi rentetan kosong, kerana mengalih keluarnya akan beralih setiap indeks kemudian. A TOML akar dokumen sentiasa jadual, jadi tatasusunan atau nilai kosong pada akar ditolak dengan ayat yang mengatakan mengapa.

YAML: sauh, aliran dan masalah Norway

YAML dibaca dengan skema terhad yang sahaja boleh menghasilkan rentetan, nombor, boolean, nol, senarai dan peta. Teg yang membina objek sewenang-wenang — !!js/function, !!python/object/apply, !!binari — ditolak, yang merupakan sebab keseluruhan sekatan wujud: pemuat yang menghormatinya ialah pembina objek sewenang-wenang yang memakai pakaian fail konfigurasi.

Sauh dan alias diselesaikan menjadi data berulang. Dokumen yang melepasi sejuta nilai selepas aliasnya diikuti ditolak daripada dibenarkan untuk membekukan tab; alias rekursif ditolak mentah-mentah, kerana tiada format lain di sini boleh menyatakan kitaran.

Aliran beberapa dokumen yang dipisahkan oleh --- menjadi susunan dokumen, dan penukaran menyatakan demikian. Tiada format lain dalam alat ini mempunyai strim, jadi tatasusunan adalah satu-satunya pemetaan yang jujur.

YAML melarang kunci pemetaan berulang dan setiap penghurai mengendalikannya secara berbeza. Alat ini mengekalkan nilai terakhir — peraturan JSON.parse gunakan — dan memberitahu anda ia berlaku, dengan kedudukan ulangan. Membuang dokumen secara senyap akan menjadi lebih teruk; memilih nilai secara senyap tanpa berkata demikian akan menjadi lebih teruk.

Masalah Norway: dalam YAML 1.1, skalar yang tidak disebut y, ya, hidup, tidak, mati dan kod negara TIDAK semuanya diselesaikan kepada boolean, iaitu cara senarai kod negara bertukar menjadi senarai benar dan salah. Alat ini membaca YAML 1.2, di mana sahaja benar dan salah adalah boolean, jadi NO kekal sebagai rentetan NO. Apabila ia menulis YAML ia memetik setiap rentetan a 1.1 penghurai akan salah baca - 'TIDAK', 'ya', 'hidup', '1.0', '0755', '2001-12-14' — jadi output selamat untuk disuap ke alat yang belum dipindahkan ke 1.2. Itu memerlukan beberapa aksara petikan dan membeli ketepatan.

Rentetan yang kelihatan seperti nombor menyimpan petikan atas sebab yang sama: "0755" kekal sebagai rentetan daripada menjadi 755 dan "1.0" kekal sebagai rentetan daripada menjadi 1.

Komen hilang di setiap arah. JSON, CSV dan yang lain tidak mempunyai tempat untuk meletakkannya, dan tiada cara untuk meneka ke mana mereka harus kembali.

JSON hingga CSV: merata, dan apostrof yang menghentikan formula

Tatasusunan menjadi baris, satu rekod setiap elemen. Objek yang sifat tunggalnya memegang tatasusunan menggunakan tatasusunan itu sebagai baris, kerana {"pengguna": [ ... ]} ialah jadual dengan label — dan penukaran menyatakan dengan lantang bahawa ia melakukan perkara itu. Sebarang objek lain ialah satu baris. Rentetan kosong, nombor atau nol ditolak: segi empat tepat memerlukan rekod.

Objek dan tatasusunan bersarang diratakan menjadi nama lajur bertitik, dengan titik untuk kedua-dua kunci objek dan indeks tatasusunan: address.city, teg.0, teg.1. Satu pemisah, satu peraturan. Kunci yang sudah mengandungi titik menjadikan nama lajurnya samar-samar dengan laluan bersarang; alat itu memberi amaran daripada mencipta skim pelepasan aksara yang tidak akan difahami oleh hamparan.

Kekunci disatukan merentasi setiap baris, dalam susunan pertama dilihat. Baris yang tiada medan mendapat sel kosong dan bukannya lajur yang dialihkan, dan penukaran memberi amaran bahawa baris itu compang-camping. Objek kosong atau tatasusunan kosong menjadi satu sel kosong di bawah laluannya sendiri dan bukannya lenyap.

Petikan mengikut RFC 4180: medan yang mengandungi pembatas, petikan berganda, CR atau LF disertakan dalam petikan berganda dan petikan terbenam ditulis dua kali. Rekod dipisahkan oleh CRLF. Medan dengan ruang kosong di hadapan atau mengekori dipetik juga, kerana hamparan secara senyap memangkasnya sebaliknya. Unicode melaluinya tidak berubah dan tanda tertib bait boleh diberi awalan untuk hamparan yang memerlukan satu untuk membaca UTF-8.

Suntikan formula adalah yang menggigit. Sel yang bermula dengan =, +, -, @, tab atau carriage return dilaksanakan sebagai formula oleh Excel, LibreOffice Calc dan Helaian Google sebaik sahaja fail dibuka. =cmd|'/c calc'!A1 ialah demonstrasi yang dipetik oleh semua orang; =IMPORTXML(...) ialah helaian yang secara senyap-senyap menghantar helaian ke suatu tempat. Penukar yang menulis kata kerja rentetan sedemikian telah menukar data anda menjadi pelaksanaan kod orang lain, dalam fail yang kelihatan lengai.

Jadi sel teks yang bermula dengan salah satu daripada aksara tersebut diawali dengan apostrof, yang setiap hamparan utama dibaca sebagai "ini adalah teks" dan tidak ditunjukkan dalam sel. Nombor dibiarkan sahaja: angka -5 ialah nombor, bukan formula. Kiraan sel yang pelepasan aksara dilaporkan dan proses pelepasan aksara boleh dimatikan — dalam hal ini alat menyatakan dengan jelas perkara yang baru anda matikan.

CSV tidak boleh membezakan rentetan kosong daripada nol. Kedua-duanya menjadi sel kosong, dan penukaran mengira nol supaya anda tahu ia berlaku.

Had, dan apa yang berlaku apabila anda memukul satu

Setiap format mempunyai had aksara, dikuatkuasakan sebelum penghurai dimuat turun: 8 juta untuk JSON, 4 juta untuk XML dan untuk a CSV sumber, 2 juta untuk YAML dan TOML. Selain itu, alat itu menolak dengan nombor yang tepat, dan bukannya menjadi tab tidak responsif yang kehilangan apa yang anda tampalkan.

Output CSV juga dihadkan pada 100,000 baris dan 2,000 lajur, kerana tatasusunan bersarang dalam mendatar menjadi satu lajur setiap elemen dan beberapa megabait JSON boleh menjadi jadual tanpa hamparan akan dibuka.

Input kosong dan ruang kosong sahaja dilaporkan sebagai kosong dan bukannya ditukar kepada nol atau dokumen kosong. Sintaks tidak sah dilaporkan dengan baris dan lajur dalam keempat-empat format yang boleh dibaca.

Penghurai itu sendiri dimuat turun sahaja apabila penukaran memerlukannya. Membuka kit alat untuk menyahkod JWT tidak mengambil satu pun daripadanya.

Apa yang berlaku kepada apa yang anda tampal

  • Setiap penukaran, cincang, penyahkod dan perbezaan berjalan dalam tab pelayar anda. Tiada input dimuat naik, dilog atau disimpan pada pelayan, kerana tiada pelayan yang terlibat selepas halaman dimuatkan.
  • Hashes datang daripada pelaksanaan Web Crypto sendiri pelayar, dan UUID daripada penjana rawak yang selamat secara kriptografi. Kedua-duanya tidak melibatkan panggilan rangkaian.
  • Tiada apa-apa yang anda taip ditulis pada storan tempatan atau kuki. Memuat semula halaman akan membuangnya; menutup tab membuangnya.
  • Analitis seluruh tapak berjalan sahaja pada hos pengeluaran kanonik yang dikonfigurasikan dan didedahkan dalam Dasar Privasi; tempatan dan hos pratonton menolaknya. Nilai, token, URL dan kandungan fail yang ditampal dikecualikan daripada acara analitis ToolAcre sendiri. Pengiklanan dilumpuhkan dalam konfigurasi semasa.
  • Yang berkata: kunci JWT atau API ialah bukti kelayakan langsung. Tabiat selamat adalah jangan sekali-kali menampal satu ke halaman web yang anda tidak tulis, walau bagaimanapun boleh dipercayai dakwaannya — termasuk yang ini.

Soalan

Mengapakah dokumen XML saya gagal dengan "mengisytiharkan DOCTYPE"?

Kerana ia mengandungi pengisytiharan jenis dokumen, dan penukar ini menolak setiap satu daripadanya daripada mempercayai tetapan penghurai untuk mengendalikan entiti dengan selamat. Padamkan DOCTYPE jika kandungannya adalah milik anda. Tiada pilihan untuk membenarkannya.

Mengapakah tarikh tarikh TOML saya kembali sebagai rentetan yang disebut?

Kerana JSON, YAML dan XML tidak mempunyai jenis tarikh. Tarikh masa telah ditukar kepada teks RFC 3339 yang ditulis sebagai, yang merupakan rentetan dalam setiap format lain. Oleh itu, penukaran kembali menghasilkan rentetan, dan alat itu memberi amaran kepada anda pada masa ia berlaku dan bukannya membiarkan anda mengetahuinya kemudian.

Mengapakah salah satu daripada CSV sel saya bermula dengan apostrof?

Kerana teksnya bermula dengan =, +, -, @, tab atau carriage return, dan hamparan melaksanakan sel sedemikian sebagai formula apabila fail dibuka. Apostrof menandakan sel sebagai teks; ia bukan sebahagian daripada nilai sebaik sahaja sel dibaca. Anda boleh mematikan pelepasan aksara dan alat itu akan memberitahu anda maksudnya.

Mengapakah satu elemen XML berulang bukan tatasusunan?

Kerana XML tidak menyediakan cara untuk membezakan senarai satu daripada satu nilai. Kedua-duanya ditulis sama. Membuat tekaan dalam mana-mana arah akan menjadi salah separuh masa, jadi alat melaporkan perkara yang sebenarnya ada.

Bolehkah saya menukar CSV kembali kepada JSON di sini?

Tidak. Membaca CSV dengan betul memerlukan penentuan pembatas, dialek petikan, sama ada baris pertama ialah pengepala dan jenis untuk setiap sel. Penukar yang meneka keempat-empat adalah salah secara senyap-senyap, yang merupakan cara paling teruk untuk menjadi salah. Gunakan alat CSV yang bertanya.

Mengapa "TIDAK" tidak ditukar kepada palsu?

Kerana tingkah laku itu tergolong dalam YAML 1.1 dan alat ini berbunyi YAML 1.2, di mana sahaja benar dan salah adalah boolean. Tingkah laku 1.1 ialah sebab kod negara Norway menjadi jenaka dalam pengurusan konfigurasi. Apabila alat menulis YAML ia memetik rentetan sedemikian supaya tiada 1.1 penghurai hiliran boleh salah membacanya sama ada.

Had

  • CSV ditulis, tidak pernah dibaca. Tiada penukaran CSV hingga JSON di sini, mengikut pilihan.
  • Komen hilang dalam setiap arah, dalam setiap format yang ada.
  • Masa tarikh TOML menjadi rentetan dalam setiap format lain, jadi TOML perjalanan pergi dan balik menukar jenis tersebut. Tiada jalan tanpa kerugian.
  • Dokumen XML yang mengandungi DOCTYPE ditolak mentah-mentah, termasuk yang tidak berbahaya dan penolakan tidak boleh dimatikan.
  • Satu elemen XML yang berulang tidak boleh dibezakan daripada yang tidak berulang, jadi XML hingga JSON hingga XML tidak sentiasa mengembalikan bentuk asal.
  • XML kandungan bercampur — teks bersilang dengan elemen kanak-kanak — kehilangan kedudukan teks berbanding kanak-kanak dan tidak boleh pergi balik.
  • Nilai XML ialah rentetan melainkan inferens jenis dihidupkan, kerana XML tidak mengisytiharkan jenis; dengan inferens pada, "0755" dan "NO" tertakluk kepada salah baca biasa.
  • TOML tidak mempunyai null: kekunci null digugurkan daripada output TOML dan null di dalam tatasusunan menjadi rentetan kosong.
  • Akar dokumen TOML mestilah jadual, jadi tatasusunan atau skalar JSON tidak boleh ditukar kepada TOML sama sekali.
  • JSON nombor ialah IEEE-754 beregu. Integer melepasi 2^53 ditukar kepada rentetan dan bukannya dibundarkan secara senyap, yang menukar jenisnya.
  • CSV tidak boleh membezakan rentetan kosong daripada nol; kedua-duanya ditulis sebagai sel kosong.
  • CSV meratakan menggunakan titik untuk kedua-dua kunci objek dan indeks tatasusunan, jadi kunci yang sudah mengandungi titik menghasilkan nama lajur samar-samar yang diberi amaran tetapi tidak terlepas.
  • YAML sauh dan alias diselesaikan dan bukannya dipelihara; output tidak mempunyai sauh, dan alias rekursif ditolak kerana tiada format sasaran boleh menyatakan kitaran.
  • Input dihadkan setiap format — 8 juta aksara untuk JSON, 4 juta untuk XML, 2 juta untuk YAML dan TOML — dan dokumen bersaiz besar ditolak dan bukannya diproses secara perlahan.
  • Tiada apa-apa di sini yang mengesahkan terhadap skema. Dokumen boleh ditukar dengan bersih dan masih salah untuk tujuannya.