Seorang jurutera DevOps mengeksport konfigurasi Kubernetes sebagai YAML tetapi perlu menghantarnya ke API yang hanya menerima JSON. Seorang penganalisis menerima data respons API dalam JSON tetapi memerlukannya dalam hamparan. Seorang saintis data mengeksport CSV dari pangkalan data tetapi memerlukan JSON berstruktur untuk papan pemuka web.
Penukaran format bukan sekadar operasi mekanikal. Setiap format membuat pertukaran yang berbeza, dan memahami apa yang hilang dalam penukaran sama pentingnya dengan mengetahui cara menukar.
Tiga format, tiga falsafah
Setiap format direka untuk khalayak dan masalah yang berbeza:
| Format | Lahir | Direka untuk | Falsafah teras |
|---|---|---|---|
| CSV | ~1972 | Pertukaran data antara program | Kesederhanaan maksimum — hanya baris dan lajur |
| JSON | 2001 | Pertukaran data web | Data berstruktur boleh dibaca mesin dengan peraturan ketat |
| YAML | 2001 | Fail konfigurasi | Data berstruktur boleh dibaca manusia dengan sintaks minimum |
CSV menganggap data anda adalah jadual rata. Setiap nilai adalah rentetan. Tiada konsep sarang, penaipan, atau metadata.
JSON menganggap data anda mempunyai struktur — objek, tatasusunan, jenis (rentetan, nombor, boolean, null). Ia ketat dan tidak samar, menjadikannya sesuai untuk mesin tetapi bertele-tele untuk manusia.
YAML menganggap manusia akan membaca dan mengedit fail. Ia menggunakan inden berbanding pendakap, menyokong komen, dan mempunyai sintaks yang lebih longgar. Secara teknikal, YAML adalah superset JSON — mana-mana dokumen JSON sah juga adalah YAML sah.
YAML adalah superset JSON Anda boleh menampal dokumen JSON terus ke parser YAML dan ia akan berfungsi. Sebaliknya tidak benar — ciri YAML seperti komen, sauh, dan rentetan berbilang baris tiada padanan JSON.
Senario penukaran dunia sebenar
Penghijrahan konfigurasi (JSON ke YAML, YAML ke JSON)
Ini adalah penukaran paling biasa. Alat berbeza menjangka format konfigurasi berbeza:
- Docker Compose, Kubernetes, GitHub Actions, Ansible menggunakan YAML
- package.json, tsconfig.json, ESLint menggunakan JSON
- Berhijrah antara alat sering bermakna menukar konfigurasi
Penukaran ini tanpa kehilangan dalam kedua-dua arah untuk kandungan data — tetapi komen YAML hilang apabila menukar ke JSON, kerana JSON tiada sintaks komen.
Analisis data (JSON ke CSV)
Respons API datang dalam JSON. Penganalisis memerlukan hamparan. Penukaran ini berfungsi baik untuk tatasusunan JSON rata — tatasusunan objek dengan kunci sama memetakan secara semula jadi ke baris dan lajur.
Tetapi ia rosak dengan data bersarang. Objek JSON dengan medan address.city dan tatasusunan skills tiada perwakilan CSV semula jadi. Penukar mesti memilih: ratakan kunci bersarang, serikan nilai bersarang sebagai rentetan, atau buang.
Import data (CSV ke JSON)
Senario sebaliknya: mengimport data hamparan ke aplikasi web atau API. Penukaran CSV ke JSON mencipta tatasusunan objek, dengan pengepala lajur sebagai kunci. Masalahnya ialah CSV tiada maklumat jenis — nombor 42, rentetan "42", dan boolean true semuanya hanya teks dalam CSV. Penukar mesti meneka jenis.
Kebolehbacaan manusia (JSON ke YAML)
Kadang-kala anda hanya perlu menjadikan fail konfigurasi JSON padat boleh dibaca. Menukar ke YAML memberikan inden bersih dan kebolehan menambah komen untuk dokumentasi. Ini terutamanya berharga untuk fail konfigurasi besar yang akan diselenggarakan oleh pasukan.
Apa yang hilang dalam penukaran
Ini adalah pengetahuan kritikal yang menjimatkan masa penyahpepijatan:
| Penukaran | Apa yang hilang |
|---|---|
| YAML ke JSON | Komen (JSON tiada sintaks komen) |
| JSON ke CSV | Sarang (CSV rata), jenis (semuanya menjadi teks), tatasusunan |
| CSV ke JSON | Tiada (tetapi jenis mesti disimpulkan — "42" vs 42) |
| CSV ke YAML | Tiada (isu simpulan jenis yang sama) |
| JSON ke YAML | Tiada (YAML adalah superset JSON) |
| YAML ke CSV | Komen, sarang, jenis, sauh/alias |
Coraknya jelas: penukaran ke CSV kehilangan maklumat paling banyak, kerana CSV format paling mudah. Penukaran antara JSON dan YAML hampir tanpa kehilangan. Dan komen YAML sentiasa hilang apabila meninggalkan YAML.
Dua hala vs satu hala JSON-ke-YAML dan YAML-ke-JSON secara efektif dua hala (selamat pergi-balik, kecuali komen). JSON-ke-CSV dan YAML-ke-CSV satu hala untuk data kompleks — anda tidak boleh membina semula sarang daripada CSV rata.
Perangkap biasa semasa menukar
Perangkap paksaan jenis YAML
YAML secara automatik mentafsir rentetan tertentu sebagai jenis bukan rentetan. Perkataan no menjadi boolean false. Perkataan yes menjadi true. Rentetan 1.0 menjadi apungan. Kod negara seperti NO (Norway) terkenal menyebabkan pepijat. Sentiasa petikkan nilai samar dalam YAML.
Kekeliruan pemisah dan pengekodan CSV
Tidak semua CSV menggunakan koma. CSV Eropah sering menggunakan koma bertitik (kerana koma adalah pemisah perpuluhan dalam banyak format nombor Eropah). Nilai dipisahkan tab (TSV) adalah varian lain. Dan ketidakpadanan pengekodan aksara (UTF-8 vs Latin-1) menghasilkan aksara bertanda yang rosak.
Masalah koma di hujung JSON
JSON tidak membenarkan koma di hujung. Ini JavaScript sah: {"a": 1, "b": 2,} — tetapi ia JSON tidak sah. Satu koma di hujung menyebabkan ralat penguraian.
Prestasi set data besar
Untuk set data berjuta baris, CSV jauh lebih cekap daripada JSON atau YAML. JSON menambah pendakap, kurungan, dan petikan untuk setiap nilai. CSV 1 juta baris mungkin 50 MB; JSON setara boleh 150 MB.
Memilih format yang betul dari awal
Daripada menukar selepas fakta, memilih format yang betul dari awal mengelakkan kehilangan maklumat:
- Data berjadual untuk hamparan atau pangkalan data — CSV
- Data berstruktur untuk API atau aplikasi web — JSON
- Konfigurasi yang manusia akan edit — YAML
- Data bersarang kompleks dengan komen — YAML
- Pertukaran data antara sistem — JSON
Ketahui lebih lanjut
Tukar antara JSON, YAML, dan CSV serta-merta dengan alat berasaskan pelayar:
- Tukar Format Data — tampal data anda, pilih format sasaran, muat turun hasilnya
- JSON Formatter — sahkan, format, dan kecilkan JSON
- Penukar JSON ke CSV — tukar tatasusunan JSON kepada CSV sedia hamparan
- Penukar YAML-JSON — tukar antara YAML dan JSON dengan kesedaran komen
