Alat pengembang · Konverter sintaksis
YAML fitur hilang dalam konversi JSON: komentar, jangkar, dan tag
· Cara kerjanya
yaml json format data
YAML memiliki komentar, jangkar, alias, kunci gabungan, tag, dan aliran multi-dokumen; JSON tidak memilikinya. Posting ini menjelaskan apa yang dilakukan konverter pada masing-masing file dan mengapa konversi kembali tidak pernah mengembalikan file asli.
File kembali lebih lama dan tanpa satu komentar pun — konfigurasi YAML dikonversi ke JSON dan sebaliknya, dan segala sesuatu yang tidak bertahan
File YAML dapat kembali dari JSON lebih lama bahkan setelah setiap komentar hilang. Jangkar yang berbagi satu pemetaan diselesaikan menjadi data objek berulang, sehingga serializer menulis setiap salinan secara independen. Nilai-nilainya mungkin masih sama, namun struktur penulis dan penjelasannya telah hilang.
Itulah sebabnya perjalanan pulang pergi YAML-ke-JSON-ke-YAML harus dinilai sebagai konversi data, bukan pelestarian sumber. ToolAcre membaca grafik nilai terbatas dan menulis dokumen baru. Itu tidak pernah mempertahankan pohon sintaksis konkrit yang berisi komentar, nama jangkar, pilihan kutipan atau presentasi blok-skalar.
Komentar — mengapa JSON tidak memiliki tempatnya dan setiap # baris hilang setelah konversi
Komentar dibuang oleh parser YAML karena JSON tidak memiliki node komentar. Baris yang dimulai dengan `#` dapat menjelaskan mengapa ada batas waktu atau siapa yang memiliki layanan; setelah dihapus, tidak ada algoritma yang dapat menyimpulkan kata-kata atau penempatannya. Mengonversi kembali akan menghasilkan YAML yang valid tanpa konteks operasional tersebut.
Pertahankan file asli dalam kontrol versi dan tinjau perbedaannya sebelum menggantinya. Jika tujuannya hanya untuk memeriksa nilai yang diselesaikan, JSON berguna. Jika tujuannya adalah memformat ulang sambil tetap mempertahankan komentar, konverter nilai umum ini adalah representasi yang salah.
Jangkar dan alias — &default dan *default diperluas menjadi salinan berulang, dan bagaimana file berkembang sebagai hasilnya
Jangkar dan alias diterima dalam batas keamanan, lalu diselesaikan. `base: &b {x: 1}` dan `copy: *b` menjadi dua jalur objek yang berisi `x: 1`. Output YAML menggunakan `noRefs`, sehingga identitas objek bersama tidak membuat jangkar baru. Hubungan yang kompak akan hilang bahkan ketika nilai-nilai yang diulang-ulang tetap bertahan.
Alias rekursif ditolak karena JSON tidak dapat mengekspresikan siklus. Perluasan alias dibatasi oleh jumlah alias, penyarangan, dan pengukuran node yang diperluas; sebuah dokumen pendek yang akan dirangkai menjadi lebih dari satu juta nilai dihentikan. Ini melindungi tab tanpa mengklaim dukungan YAML secara sewenang-wenang.
Kunci gabungan — konvensi <<: dari YAML 1.1, bagaimana parser yang mendukungnya meratakan pemetaan yang digabungkan, dan apa yang terjadi pada parser yang tidak mendukungnya
Garis besarnya mengasumsikan YAML 1.1 kunci gabungan diratakan. ToolAcre hanya memuat JSON atau skema Inti js-yaml, tidak ada satupun yang mengaktifkan jenis penggabungan. Berdasarkan skema ini, kunci `<<` adalah data biasa, bukan instruksi untuk menggabungkan pemetaan. Oleh karena itu, menampilkan penggabungan yang rata sebagai perilaku pengiriman adalah salah.
Jika sumber Anda bergantung pada semantik kunci gabungan, selesaikan masalah tersebut di aplikasi yang memiliki konvensi tersebut atau tulis ulang nilainya secara eksplisit sebelum konversi. Alias yang digunakan sebagai nilai `<<` biasa mungkin masih dapat ditetapkan ke suatu objek, tetapi kuncinya tetap `<<`; itu tidak setara dengan menggabungkan anggotanya menjadi induk.
Kunci penggabungan tidak diaktifkan oleh dua skema terbatas yang dikirimkan konverter ini
Tag eksplisit standar yang dikenali oleh skema terbatas dapat memilih tipe dasar, seperti `!!str` atau `!!int`. Tag khusus dan lebih kaya—termasuk biner, stempel waktu, set, peta terurut, fungsi JavaScript, dan konstruktor objek Python—ditolak. Mereka tidak dirangkai dan tidak pernah dieksekusi.
Aliran YAML yang dipisahkan oleh `---` diterima. Satu dokumen menjadi satu nilai; beberapa menjadi array dengan peringatan yang menyebutkan jumlah dokumen. Pemisah tambahan dapat membuat dokumen akhir yang kosong sesuai dengan skema yang dipilih. Tidak ada target di sini yang memiliki model aliran, jadi arraynya adalah konvensi yang dideklarasikan.
Tag yang tidak aman ditolak; aliran multi-dokumen menjadi array
Gunakan `defaults: &d` dengan percobaan ulang dan batas waktu, komentar yang menjelaskan batas waktu, lalu `service:` dengan `inherited: *d`. JSON berisi default dan objek warisan berulang; komentar dan nama jangkar tidak ada. Mengonversi kembali JSON akan memancarkan dua pemetaan, bukan hubungan jangkar.
Tambahkan `---` diikuti dengan dokumen lain dan root JSON menjadi array dokumen. Tambahkan `!!binary` dan konversi berhenti dengan petunjuk skema terbatas. Ketiga perubahan ini membedakan data yang didukung terselesaikan, konvensi struktural, dan konstruksi yang tidak didukung sepenuhnya.
Apa yang tidak tercakup di sini — urutan kunci dan gaya kutipan, yang biasanya bertahan tetapi tidak dijamin oleh format mana pun
Urutan penyisipan objek biasa sering kali tetap terlihat, namun ini bukan pelestarian gaya sumber, dan pemilihan tombol pengurutan sengaja mengubahnya. Kutipan, gaya aliran versus blok, ejaan skalar, dan komentar tidak dapat dipertahankan. Kunci pemetaan duplikat menyimpan nilai terakhir dengan peringatan daripada mempertahankan kedua entri yang tidak valid.
Penulis melindungi string yang ambigu dengan mengutip nilai yang mungkin salah dibaca oleh konsumen YAML 1.1, namun pilihan keamanan tersebut dapat berbeda dari gaya asli penulis. Kesetaraan data adalah ujian yang dapat dipertahankan untuk nilai biasa berbentuk JSON; kesetaraan tekstual tidak.
Urutan kunci mungkin tetap ada, sementara komentar, jangkar, ejaan dan gaya tag tidak dipertahankan
YAML-to-JSON bersifat lossy setiap kali makna berada di luar nilai berbentuk JSON: komentar, alias, tag yang tidak didukung, batasan aliran, dan gaya. ToolAcre membuat beberapa kerugian terlihat dan menolak konstruksi berbahaya atau siklus daripada berpura-pura mempertahankannya.
Konversikan file representatif sebelum mengadopsi alur kerja. Periksa peringatan, bedakan nilai yang diselesaikan, dan pertahankan YAML yang ditulis. Panel ini merupakan lensa yang sangat bagus untuk melihat apa yang dilihat oleh parser, tetapi panel ini bukan editor yang menyimpan komentar atau transformator model objek YAML lengkap.
Untuk tinjauan migrasi, pisahkan perubahan nilai dari perubahan sumber saja. Perbandingan mendalam JSON dapat menentukan apakah nilai-nilai biasa bertahan, sementara perbedaan teks mengungkapkan komentar, jangkar, dan gaya yang perlu diubah. Tidak ada cek yang menggantikan cek lainnya. Menyebut perbandingan nilai lossless akan mengabaikan informasi sumber; menyebut setiap perubahan tekstual sebagai kegagalan data akan mengabaikan serialisasi ulang yang valid.