Bahasa Indonesia

Alat pengembang · Konverter sintaksis

Pemetaan XML hingga JSON: atribut, node teks, dan masalah satu lawan banyak

· Cara kerjanya

xml json format data

Satu item XML dipetakan ke suatu objek sementara item berulang dipetakan ke array
Ilustrasi vektor ToolAcre asli

Tidak ada satu pun cara yang benar untuk mengubah XML menjadi JSON, karena XML memiliki atribut, konten campuran, dan turunan terurut yang tidak dimiliki JSON. Posting ini menjelaskan konvensi pemetaan umum dan jebakan di masing-masing konvensi.

Mengapa satu <item> menjadi objek dan dua lagi menjadi array — feed XML yang bentuk JSONnya berubah bergantung pada berapa banyak entri yang dimilikinya

Umpan dengan `<item>one</item>` menghasilkan `"item": "one"`; menambahkan saudara kedua akan mengubah properti itu menjadi `"item": ["one", "two"]`. Pengurai tidak dapat menyimpulkan bahwa satu item secara konseptual merupakan daftar satu item karena kedua makna memiliki sintaksis XML yang identik. Oleh karena itu, kode yang dibuat hanya berdasarkan sampel pertama dapat gagal ketika produksi mengirimkan sampel kedua.

ToolAcre tidak menyembunyikan ketidakstabilan ini di balik opsi selalu array. Ini mencatat nama sekali sebagai satu nilai dan saudara berulang sebagai array. Pemetaan langsung tersebut mudah untuk diperiksa, namun konsumen yang membutuhkan bentuk kumpulan yang stabil harus menggunakan pengetahuan skema atau menormalkan sendiri hasilnya setelah konversi.

Apa yang XML miliki yang tidak dimiliki JSON — atribut, teks bercampur dengan elemen, saudara kandung, namespace, komentar, dan instruksi pemrosesan

XML memisahkan atribut dari elemen turunan, mempertahankan urutan saudara, mengizinkan teks antar elemen, membawa awalan namespace, dan dapat berisi komentar dan instruksi pemrosesan. JSON menawarkan objek dan array tetapi tidak memiliki padanan bawaan untuk kategori node tersebut. Oleh karena itu, hasil XML-ke-JSON apa pun merupakan proyeksi yang dipilih, bukan terjemahan universal.

Pembaca ini menghilangkan deklarasi, komentar, dan instruksi pemrosesan. Awalan namespace tetap kata demi kata dan tidak diselesaikan: `<ns:item>` menjadi kunci `ns:item`, sedangkan `xmlns:ns` menjadi `@xmlns:ns`. Teks campuran digabungkan dalam satu kunci, sehingga posisi aslinya di sekitar elemen anak hilang dan peringatan mengatakan konversi tidak dapat dilakukan bolak-balik.

Konvensi atribut — awalan seperti @ atau $, alasan keberadaannya, dan bagaimana atribut dan elemen turunan dengan nama yang sama bertabrakan

Atribut menggunakan awalan `@`. `<user id="7"><id>other</id></user>` menjadi objek dengan `@id` sama dengan `"7"` dan turunan `id` sama dengan `"other"`. Awalan mencegah dua konstruksi XML berbeda bertabrakan dalam satu properti objek. Ini juga menjadi bagian dari kontrak konverter ketika JSON ditulis kembali ke XML.

Perpustakaan lain mungkin menggunakan `$`, objek atribut atau konvensi lain. ToolAcre hanya mendukung pemetaan `@` yang terlihat. Mengubah awalan tersebut dalam kode aplikasi tanpa mengubah penulis akan mengubah atribut menjadi elemen, jadi pertahankan saat menggunakan nilai yang dikonversi sebagai formulir pemeriksaan perantara.

Konvensi simpul teks — #teks atau _ untuk konten elemen, dan apa yang terjadi jika suatu elemen memiliki teks dan turunan

Elemen yang hanya berisi teks akan diciutkan ke string tersebut. Jika atribut atau turunan juga ada, teks berada di bawah `#text`; CDATA disimpan secara terpisah di bawah `#cdata`. Tag yang menutup sendiri menjadi string kosong. Kunci khusus ini memungkinkan penulis membedakan nama anak biasa dari kategori konten yang tidak ditentukan oleh JSON sendiri.

Konten campuran tetap bersifat lossy. Dalam `<p>before<b>bold</b>after</p>`, posisi “sebelum” dan “sesudah” relatif terhadap anak tidak dapat direkonstruksi dari properti gabungan `#text`. Alat ini mendeteksi pola struktural tersebut dan memberikan peringatan. Gunakan XML API yang mempertahankan simpul ketika urutan dokumen adalah bagian dari maknanya.

Masalah satu lawan banyak - elemen berulang menjadi array hanya jika diulang, dan mengapa konsumen harus membuat kode secara defensif

Saudara yang berulang berubah menjadi array hanya setelah pengulangan diamati. Satu `<book>` adalah satu objek; dua buku adalah serangkaian objek. Hal ini terkadang disebut masalah satu lawan banyak, namun ini bukan merupakan cacat parser. Dokumen sumber tidak berisi deklarasi daftar yang independen terhadap kemunculannya.

Konsumen defensif dapat menormalkan jalur yang diketahui dengan pengetahuan skema: bungkus `catalogue.book` jika jalur tersebut belum berupa array. Jangan terapkan aturan itu pada setiap properti, karena skalar biasa tidak boleh menjadi daftar sekadar simetri. Konverter sengaja menghindari menciptakan informasi domain tersebut.

Contoh praktis: mengonversi dokumen kecil bergaya RSS — atribut, elemen berulang, dan namespace, dengan hasil yang diberi anotasi JSON

Konversi `<feed xmlns:m="https://example.invalid/meta"><item id="1"><m:title>One</m:title></item><item id="2"><m:title><![CDATA[Two & More]]></m:title></item></feed>`. Akarnya adalah `feed`; `@xmlns:m` mempertahankan deklarasi namespace; `item` adalah sebuah array; setiap `@id` adalah teks; dan judul kedua berisi `#cdata`.

Jenis inferensi dinonaktifkan secara default, sehingga `id="2"` tetap menjadi string `"2"`. Mengaktifkan inferensi memungkinkan parser membaca teks numerik dan Boolean seperti tipe JavaScript tersebut, namun XML tidak menyatakan maksud tersebut. Pilihannya adalah tebakan yang dikendalikan oleh pengguna, bukan bukti yang diberikan oleh dokumen.

Apa yang tidak tercakup di sini — konversi berbasis skema yang mengetahui suatu elemen selalu berupa daftar, yang memerlukan XSD atau pemetaan manual

Tidak ada XSD yang dimuat, dan tidak ada informasi daftar berdasarkan skema yang tersedia. Konverter tidak dapat mengetahui bahwa suatu elemen dapat diulang ketika hanya satu yang muncul, memvalidasi turunan yang diperlukan, menyelesaikan URI namespace ke dalam tipe aplikasi, atau menghasilkan klien yang diketik. Penguraian yang berhasil hanya menghasilkan XML yang diterima oleh pembaca yang dikonfigurasi.

Deklarasi DOCTYPE ditolak sebelum diuraikan, termasuk deklarasi yang tidak berbahaya. Batasan tersebut mencegah permintaan entitas eksternal, pembacaan file lokal, dan perluasan entitas. Menghapus DOCTYPE juga dapat menghapus deklarasi yang menjadi sandaran dokumen, jadi lakukan itu hanya jika Anda memiliki data dan memahami konsekuensinya.

Kesimpulan: XML hingga JSON adalah pemetaan, bukan terjemahan — dan bagaimana panel Konverter Sintaks memungkinkan Anda memeriksa pemetaan tersebut di browser Anda

Perlakukan hasilnya sebagai pemetaan terdokumentasi ToolAcre: `@` untuk atribut, `#text` untuk teks elemen campuran, `#cdata` untuk CDATA, array setelah saudara berulang dan awalan namespace literal. Aturan tersebut membuat keluaran dapat diprediksi tanpa berpura-pura XML dan JSON berbagi satu model data.

Untuk pemeriksaan, proyeksi ini cepat dan mudah dibaca. Untuk integrasi yang tahan lama, uji satu dan banyak kemunculan, atribut yang berbagi nama dengan turunan, elemen kosong, konten campuran, dan ruang nama. Jika urutan elemen atau batasan skema penting, uraikan XML terhadap kontrak tersebut daripada bergantung pada bentuk umum yang dikonversi.

Pertahankan perlengkapan XML mentah di samping ekspektasi yang dinormalisasi. Pasangan tersebut menyimpan bukti jika pemutakhiran ketergantungan mengubah penanganan array, pemangkasan spasi, atau penguraian kode entitas. Hal ini juga memberikan tempat bagi pengulas untuk melihat perbedaan yang tidak dapat dicapai oleh tampilan JSON. Objek yang dikonversi saja tidak dapat membuktikan apakah string kosong berasal dari elemen yang menutup sendiri, tag berpasangan, atau konvensi lain di sumbernya.