AI di perangkat — profesional dan privat.

Konverter XML ke JSON

XML ke JSON dalam hitungan detik, tanpa kehilangan data.

  • Berjalan di perangkat Anda
  • Lima bentuk keluaran
  • Atribut dan CDATA utuh
  • Satu berkas gratis · 50 dengan Pro

Jatuhkan XML di sini, atau tempel di bawah

XML, SVG, RSS, Atom, WSDL, XSD, KML, GPX, plist · hingga 25.0 MB · satu berkas di versi gratis

Tempel XML
Keluaran JSON
Pengaturan konversi
Struktur
Bentuk keluaran

Bentuk yang familier. Atribut berprefiks, teks di bawah satu kunci.

Prefiks atribut

Mencegah kunci atribut bentrok dengan elemen anak bernama sama.

Kunci teks

Menampung teks milik elemen ketika elemen itu juga punya atribut atau anak.

Array
Array

Paksa array ketika hasilnya langsung masuk ke kode yang tidak seharusnya memeriksa.

Namespace
Namespace

Pertahankan tepat untuk SOAP dan WSDL. Perluas tidak ambigu. Hapus bisa menyatukan dua nama menjadi satu.

Nilai

Mati secara bawaan: 007 tetap teks, +1 tetap teks, dan 1.0 tetap 1.0.

Elemen kosong
Elemen kosong
Spasi
Spasi
Keluaran
Indentasi
Keluaran
Keluaran
Pro
Lanjutan

Meloloskan   dan sejenisnya sebagai teks alih-alih menolak berkasnya. Umum di feed.

Pengodean
Pengodean
Nama berkas
Jatuhkan XML di sini, atau tempel di bawah

Cara mengonversi XML ke JSON

  1. 1

    Tambahkan XML Anda

    Tempel markup ke editor, atau jatuhkan berkas ke halaman. XML, SVG, RSS, Atom, WSDL, XSD, KML, GPX, plist, dan OPML semuanya diterima, dan pengodean karakter dideteksi dari byte-order mark atau deklarasi XML.

  2. 2

    Pilih bentuk keluaran

    Compact adalah bentuk umum yang dihasilkan kebanyakan alat. BadgerFish dan GData adalah dua konvensi yang dipakai API lama. Parker memberi nilai yang paling sederhana. JsonML menjaga urutan dokumen dan bisa dikembalikan persis.

  3. 3

    Atur cara nilai dibaca

    Tentukan apakah atribut dipertahankan dan prefiks apa yang dipakai, apakah elemen tunggal menjadi array satu item, apa jadinya elemen kosong, dan apakah angka serta boolean disimpulkan alih-alih dibiarkan sebagai teks. Pratinjau diperbarui setiap kali Anda mengubah salah satunya.

  4. 4

    Konversi, lalu unduh atau salin

    Tekan Konversi untuk menulis berkasnya. Pilih 2 spasi, 4 spasi, tab, atau keluaran terminifikasi, lalu unduh .json-nya atau salin. Dengan Pro Anda bisa mengonversi hingga 50 berkas sekaligus dan membawanya sebagai satu ZIP.

Apa yang ditawarkan alat XML ke JSON ini

Kebanyakan konverter XML ke JSON mengambil satu keputusan diam-diam untuk Anda dan tidak memberi cara mengubahnya: mereka memilih satu bentuk, membuang atribut Anda, lalu mengembalikan JSON yang tampak benar. Yang ini bertanya. Anda memilih konvensi keluaran, apakah atribut bertahan dan prefiks apa yang dipakai, apakah elemen tunggal menjadi nilai atau array satu item, apa arti elemen kosong, dan apa yang terjadi pada prefiks namespace — dan pratinjau di samping kontrol menunjukkan jawabannya saat Anda mengubah masing-masing.

  • Tidak ada yang dibuang — Atribut, bagian CDATA, teks campuran, dan instruksi pemrosesan semuanya selamat melewati konversi. Masing-masing punya kontrol sendiri, jadi Anda yang memutuskan apa yang disimpan alih-alih baru tahu belakangan apa yang hilang.
  • Lima bentuk keluaran — Compact, BadgerFish, GData, Parker, dan JsonML. Empat di antaranya konvensi yang dipakai API sungguhan; JsonML adalah yang menjaga urutan dokumen dan bisa dikembalikan persis.
  • Error yang bisa ditindaklanjuti — Penguraian yang gagal memberi baris, kolom, baris sumber, dan penunjuk di bawah karakter yang bermasalah, dengan pesan yang menyebut kesalahannya alih-alih mengulang bahwa berkasnya tidak valid.
  • Berkas besar tetap lancar — Pembacaan dan penulisan terjadi di luar antarmuka, jadi halaman tidak pernah membeku. Dokumen 25 MB dikonversi dalam sekitar satu detik, dengan bilah progres dan tombol Batal yang berfungsi.

Lima bentuk keluaran, dan kapan memakai masing-masing

Tidak ada satu cara yang benar untuk merepresentasikan XML sebagai JSON, karena itulah beberapa konvensi ada dan karena itulah pustaka yang serius membiarkan Anda memilih. XML punya atribut, anak yang berurutan, teks campuran, dan namespace; JSON punya objek, array, dan string. Setiap pemetaan mengorbankan salah satunya. Memilih pengorbanan yang tepat untuk langkah Anda berikutnya adalah sebagian besar pekerjaannya.

  • Compact — bawaan — Elemen menjadi kunci, atribut diberi prefiks @_, dan teks berada di bawah #text. Ini bentuk yang dihasilkan sebagian besar alat dan tutorial, jadi akan terasa familier bagi siapa pun yang membaca berkasnya nanti. Pilih ini kecuali Anda punya alasan lain.
  • BadgerFish — seragam — Setiap elemen adalah objek, teks selalu di bawah $, atribut di bawah @nama, dan deklarasi namespace di bawah @xmlns. Tidak ada yang pernah berupa string telanjang, jadi kode yang mengonsumsinya tidak perlu memeriksa apakah sebuah field kembali sebagai objek atau nilai. Bertele-tele, dan sebagai gantinya bisa diprediksi.
  • GData — bentuk Google — Atribut menjadi kunci biasa bersama elemen anak dan teks berada di bawah $t. Ringkas dibaca, dan pilihan yang tepat saat Anda menyesuaikan diri dengan bentuk Google Data atau Atom yang sudah ada.
  • Parker — paling sederhana — Atribut dibuang, nama elemen akar dihilangkan, dan daun menjadi nilainya. Hasilnya paling mendekati apa yang akan Anda tulis sendiri seandainya langsung mulai dari JSON. Pakai untuk konfigurasi dan data sederhana yang atributnya tidak membawa apa pun yang Anda butuhkan.
  • JsonML — tanpa kehilangan — Setiap elemen menjadi array berisi nama tag, atribut, dan anak-anaknya dalam urutan dokumen. Ini satu-satunya bentuk di sini yang selamat bolak-balik, dan satu-satunya yang bisa merepresentasikan sebuah elemen, lalu elemen lain, lalu yang pertama lagi.

Atribut, teks, dan konten campuran

Sebuah elemen XML membawa tiga hal berbeda sekaligus — atributnya, teksnya, dan elemen anaknya — sedangkan objek JSON hanya punya satu ruang kunci untuk ketiganya. Setiap konvensi menyelesaikan benturan itu dengan cara berbeda, dan benturannya nyata: elemen dengan atribut bernama nama dan elemen anak bernama nama membutuhkan keduanya bertahan.

  • Prefiks atribut — @_ secara bawaan, dan bisa diatur. Satu-satunya tugasnya adalah mencegah kunci atribut bentrok dengan elemen anak bernama sama, jadi prefiks apa pun yang tidak muncul di nama tag Anda akan berfungsi. Kosongkan jika Anda tahu tidak ada benturan dan menginginkan keluaran yang paling datar.
  • Kunci teks — #text secara bawaan. Kunci ini dipakai ketika sebuah elemen punya teks sekaligus hal lain: atribut, elemen anak, atau keduanya. Elemen yang hanya berisi teks ditulis langsung sebagai teks itu, jadi dokumen sederhana tetap sederhana.
  • Konten campuran — Paragraf yang memuat bagian tebal punya teks sebelum, di antara, dan sesudah anak-anaknya. Teks itu dikumpulkan dan disimpan di bawah kunci teks alih-alih dibuang, artinya dokumen yang lebih pantas disebut prosa daripada data tetap terkonversi menjadi sesuatu yang bisa dibaca.
  • Spasi — Teks dipangkas secara bawaan, karena indentasi pada berkas XML yang dirapikan adalah tata letak, bukan data. Ringkas mengurangi setiap rentetan spasi menjadi satu; Apa adanya menjaga teks persis seperti ditulis, yang Anda inginkan untuk apa pun yang formatnya penting, seperti kode yang disematkan.

Elemen berulang dan array

Kejutan paling umum dalam konversi XML ke JSON adalah bahwa bentuk keluarannya bergantung pada jumlah rekaman di masukan. Satu pesanan di berkas memberi Anda objek; dua memberi array. Kode yang ditulis berdasarkan sampel berisi dua pesanan akan rusak pada hari seorang pelanggan mengirim satu, dan kegagalannya tampak seperti data yang buruk alih-alih pemetaan yang ambigu.

  • Saat berulang (bawaan) — Tag yang muncul beberapa kali sebagai saudara menjadi array, menjaga urutan dan jumlah. Tag yang muncul sekali tetap nilai tunggal. Inilah yang dilakukan hampir semua konverter, dan inilah keluaran yang paling mudah dibaca.
  • Selalu — Setiap elemen yang bisa berulang menjadi array, bahkan dengan satu kemunculan. Keluarannya sedikit lebih bertele-tele dan sepenuhnya bisa diprediksi, yang Anda inginkan ketika JSON-nya langsung masuk ke kode alih-alih dibaca orang.
  • Urutan antar tag berbeda — Array menjaga urutan saudara bernama sama, tetapi tidak ada bentuk berbasis kunci yang bisa menjaga urutan yang berbeda nama — kunci sebuah objek tidak membawa urutan. Jika selang-selingnya penting, JsonML adalah bentuk yang menjaganya.

Namespace, SOAP, dan WSDL

Namespace adalah alasan XML korporat terlihat seperti itu, dan di situlah konverter yang naif diam-diam menghasilkan sesuatu yang salah. Prefiks seperti soap: bukan bagian dari nama elemen — ia penunjuk ke URI yang dideklarasikan di suatu tempat di atasnya, dan prefiks yang sama bisa berarti berbeda di bagian dokumen yang berbeda.

  • Pertahankan — Prefiks tetap persis seperti ditulis, jadi soap:Envelope tetap soap:Envelope dan JSON-nya cocok dengan dokumen yang Anda lihat. Ini bawaan yang tepat untuk respons SOAP dan WSDL, tempat prefiks adalah hal yang dirujuk semua orang.
  • Hapus — Prefiks dibuang demi bentuk yang lebih bersih dan pendek. Dua elemen dari namespace berbeda kemudian bisa jatuh ke kunci yang sama, dan itu kehilangan informasi yang sebenarnya — jadi ketika terjadi, alat ini menghitung benturannya dan memberi tahu Anda alih-alih membiarkan penggabungan itu lewat diam-diam.
  • Perluas — Setiap prefiks diganti dengan URI namespace lengkapnya dalam kurung kurawal. Tidak ada yang ambigu dan tidak ada yang bisa bentrok, dengan konsekuensi kunci yang panjang. Ini bentuk yang dipilih ketika JSON-nya akan divalidasi atau dibandingkan alih-alih dibaca.
  • Atribut tanpa prefiks — Atribut tanpa prefiks tidak berada di namespace mana pun — ia tidak mewarisi namespace bawaan elemennya. Itu aturan yang rutin dilanggar konverter, dan melanggarnya berarti mengarang namespace yang tidak pernah dideklarasikan dokumen tersebut.

Tipe, elemen kosong, dan harga sebuah tebakan

XML tidak punya tipe. Setiap nilai dalam dokumen adalah teks, dan konverter mana pun yang mengembalikan angka telah memutuskan untuk Anda bahwa teksnya terlihat cukup numerik. Keputusan itu sering berguna dan sesekali merusak, karena itu di sini ia berupa kontrol dan karena itu ia mati sampai Anda menyalakannya.

  • Yang dikonversi — Bilangan bulat dan desimal sederhana, true, false, dan null. Tidak ada yang lain.
  • Yang sengaja tidak — Nilai dengan nol di depan tetap teks, karena nomor pesanan yang ditulis 007 bukan 7. Tanda plus di depan tetap teks, karena awalan telepon bukan angka. Nilai di luar rentang bilangan bulat aman tetap teks, karena mengonversinya akan diam-diam mengubah digitnya. Begitu pula notasi eksponen atau heksadesimal, dan begitu pula Infinity dan NaN, yang diterima konversi numerik naif dan tidak pernah dimaksudkan dokumen XML mana pun.
  • Aturan bolak-balik — Sebuah nilai hanya menjadi angka jika menuliskan angka itu kembali menghasilkan persis karakter yang ada di berkas. Itulah yang melindungi 1.0, yang oleh kebanyakan konverter diubah menjadi 1 dan dikembalikan seolah tidak terjadi apa-apa.
  • Elemen kosong — Elemen kosong secara masuk akal bisa berupa string kosong, null, atau objek kosong, dan mana yang benar bergantung pada langkah Anda berikutnya. Alih-alih memilihkan untuk Anda, ini adalah kontrol, sehingga field yang boleh null bisa dibedakan dari yang memang kosong.

Ketika XML tidak bisa diurai

XML yang rusak adalah kasus biasa, bukan pengecualian, dan biasanya rusak karena salah satu dari sekitar enam alasan. Konverter yang menjawab dengan kata Tidak valid tidak memberi tahu Anda apa pun yang belum Anda ketahui; yang Anda butuhkan adalah karakter yang menyebabkannya.

  • Baris, kolom, dan penunjuk — Setiap kegagalan melaporkan tempat terjadinya, menampilkan baris sumber, dan menaruh penunjuk di bawah karakter yang tepat. Dokumen satu baris yang panjang dipotong di sekitar titik kesalahan agar berkas terminifikasi tidak mencetak dirinya seluruhnya di kotak error.
  • Ampersand tanpa escape — Kesalahan paling umum pada XML yang ditulis tangan. Sebuah & telanjang di Q&A atau di query string URL bukan markup yang valid dan harus ditulis &. Pesannya menyebutkan itu, alih-alih melaporkan error entitas yang membingungkan.
  • Tag yang tidak cocok — Tag pembuka yang ditutup dengan nama berbeda, atau tag yang dibiarkan terbuka di akhir berkas. Keduanya menyebut tag yang terlibat, dan kasus yang tidak tertutup menunjuk ke tempat elemen itu dibuka, bukan ke akhir dokumen.
  • Namespace dan duplikat — Prefiks yang dipakai tanpa dideklarasikan, atau atribut yang sama ditulis dua kali pada satu elemen. Keduanya adalah error, bukan penggabungan diam-diam, karena diam-diam menyimpan satu dari dua nilai menaruh data yang tidak ditulis siapa pun ke dalam keluaran Anda.
  • Entitas dan DTD — DOCTYPE diurai lalu dilewati, bukan diikuti. Entitas yang dideklarasikan dikenali berdasarkan namanya tetapi tidak pernah diperluas, jadi rujukan ke salah satunya dilaporkan dengan jelas alih-alih disubstitusi — yang sekaligus membuat serangan entity expansion klasik mustahil di sini.

Berkas XML apa saja yang bisa dibuka

Semua yang di bawah ini adalah XML, dan setiap satunya dulu adalah berkas yang versi sebelumnya dari halaman ini biarkan Anda pilih lalu tidak melakukan apa pun dengannya, karena versi itu hanya mengenali ekstensi .xml sementara sistem operasi sama sekali tidak melaporkan tipe untuk sebagian besar sisanya.

  • Feed dan sindikasi — RSS dan Atom, termasuk kumpulan item dan entry yang menghasilkan keluaran per baris paling berguna. OPML untuk daftar langganan.
  • Layanan web — Definisi layanan WSDL dan skema XSD, keduanya sarat namespace dan menjadi alasan Pertahankan adalah kebijakan bawaan.
  • Grafis dan geografi — Dokumen SVG, tempat konversi ke JSON adalah cara skrip build membaca sebuah path atau viewBox. KML dan GPX untuk data peta dan jejak yang terekam.
  • Konfigurasi dan dokumen — Daftar properti plist Apple, berkas .config dan .csproj, berkas POM Maven, lembar gaya XSLT, dan XHTML.

Dokumen dibaca dan ditulis di luar antarmuka, jadi halaman tetap responsif saat berkas besar dikonversi, dengan progres yang nyata dan tombol Batal yang langsung bekerja.

Opsi sekilas

  • Bentuk keluaran — Compact, BadgerFish, GData, Parker, atau JsonML. Mengubah seluruh struktur; pratinjau langsung diperbarui.
  • Atribut — Pertahankan atau buang, dan tentukan prefiks kuncinya. Diabaikan di Parker, yang membuang atribut menurut definisinya.
  • Kunci teks — Kunci yang menampung teks milik elemen ketika elemen itu juga punya atribut atau anak.
  • Array — Hanya elemen berulang, atau paksa array untuk setiap elemen yang bisa berulang.
  • Namespace — Pertahankan prefiks, hapus, atau perluas menjadi URI lengkap.
  • Tipe — Biarkan setiap nilai sebagai teks, atau simpulkan angka, boolean, dan null dengan aturan bolak-balik.
  • Elemen kosong — String kosong, null, atau objek kosong.
  • Spasi — Pangkas, ringkas rentetan menjadi satu spasi, atau simpan teks apa adanya.
  • CDATA — Gabungkan ke teks elemen, atau simpan di bawah kuncinya sendiri.
  • Komentar dan instruksi — Dibuang secara bawaan; simpan salah satunya saat Anda membutuhkannya, sesuatu yang hanya bisa diungkapkan sepenuhnya oleh bentuk yang menjaga urutan.
  • Indentasi — 2 spasi, 4 spasi, tab, atau terminifikasi dalam satu baris.
  • Pengodean — Dideteksi dari byte-order mark atau deklarasi XML, dan bisa ditimpa ketika sebuah berkas mendeklarasikan yang salah.

Mengapa mengonversi XML ke JSON?

XML masih menjadi tempat sangat banyak data nyata berada — rekening koran, feed pemerintah, layanan SOAP, berkas build, ekspor peta, dan setiap feed RSS yang pernah terbit — sementara hampir semua yang dibangun sekarang untuk mengonsumsi data mengharapkan JSON. Mengonversi biasanya jalan terpendek di antara keduanya, dan jalan itu hanya tetap pendek jika konversinya tidak kehilangan apa pun di tengah jalan.

  • Layanan lama ke kode modern — Respons SOAP menjadi sesuatu yang bisa dibaca panggilan fetch tanpa pustaka XML di dalam bundel.
  • Feed ke pipeline — Feed RSS atau Atom menjadi kumpulan rekaman, dan dengan keluaran per baris ia menjadi sesuatu yang bisa dialirkan alat data.
  • Konfigurasi ke perkakas — Sebuah plist, POM, atau berkas .config menjadi terbaca oleh skrip yang tidak punya pengurai XML.
  • Pemeriksaan — Dokumen bersarang dalam lebih mudah dibaca sebagai JSON di editor yang bisa melipatnya, dan itu sering menjadi alasan sebenarnya untuk mengonversi.
  • Tetap privat — Rekening koran dan respons layanan justru dokumen yang tidak boleh ditempelkan siapa pun ke situs yang mengunggahnya. Yang ini tidak mengunggah.

Pertanyaan yang sering diajukan

Bagaimana cara kerja konverter XML ke JSON ini?

Tempel XML Anda atau jatuhkan berkas, pilih bentuk keluaran yang diinginkan, lalu tekan Konversi. Dokumen dibaca di perangkat Anda oleh pengurai yang ditulis khusus untuk alat ini, diubah ke bentuk JSON yang Anda pilih, dan ditulis sebagai berkas yang bisa Anda unduh atau salin. Tidak ada yang diunggah.

Apakah data XML saya aman?

Ya. Berkas diproses di perangkat Anda, bukan di server kami — tidak ada unggahan, tidak ada pemrosesan di server, dan tidak ada salinan yang disimpan di mana pun. Konversi berjalan sepenuhnya di halaman, jadi Anda bisa memutus koneksi jaringan setelah halaman dimuat dan alat ini tetap bekerja. Entitas eksternal dan DTD sengaja tidak pernah diambil atau diperluas, yang sekaligus meniadakan serangan entity expansion yang menimpa pengurai XML di sisi server.

Apakah atribut XML dipertahankan?

Ya. Setiap atribut dibawa ke JSON, secara bawaan diberi prefiks @_ agar tidak bentrok dengan elemen anak bernama sama. Anda bisa mengganti prefiks itu, atau mematikan atribut sama sekali jika hanya ingin isi elemen. Di BadgerFish atribut muncul sebagai @nama, di GData sebagai kunci biasa, dan di JsonML sebagai objek atribut milik elemen. Parker adalah satu-satunya bentuk yang membuangnya, karena membuang atribut memang itulah Parker.

Apa yang terjadi pada bagian CDATA dan konten campuran?

Keduanya dipertahankan. Bagian CDATA adalah data karakter, jadi isinya secara bawaan menjadi bagian dari teks elemen; Anda juga bisa memintanya dikeluarkan terpisah di bawah kuncinya sendiri. Konten campuran — teks dengan elemen di dalamnya, seperti paragraf yang memuat bagian tebal — mempertahankan elemen anak sekaligus teks di sekelilingnya, yang dikumpulkan di bawah kunci teks.

Bagaimana elemen XML yang berulang ditangani?

Ketika tag yang sama muncul beberapa kali sebagai saudara, ia menjadi array JSON sehingga urutan dan jumlahnya terjaga. Tag yang hanya muncul sekali tetap menjadi nilai tunggal, sehingga keluaran tetap mudah dibaca. Jika hasilnya akan diberikan ke kode yang tidak seharusnya memeriksa bentuk apa yang diterimanya, aktifkan array paksa dan setiap elemen yang bisa berulang akan menjadi array meski hanya ada satu.

Bisakah konversinya dibalik dengan persis?

Pilih bentuk JsonML, maka bisa. Semua konvensi lain memberi kunci pada anak berdasarkan nama tag, sehingga urutan elemen yang berselang-seling hilang: dokumen dengan sebuah a, lalu b, lalu a lagi tidak bisa dibangun ulang dari bentuk yang menyatukan kedua a itu. JsonML merepresentasikan setiap elemen sebagai array berisi namanya, atributnya, dan anak-anaknya secara berurutan, jadi struktur aslinya bertahan.

Bagaimana namespace XML ditangani?

Ada tiga cara, dan Anda yang memilih. Pertahankan membiarkan prefiks apa adanya, jadi soap:Body tetap soap:Body — pilihan yang tepat untuk SOAP dan WSDL. Hapus membuangnya demi bentuk yang lebih bersih, dan alat ini memberi tahu Anda jika dua namespace berbeda menyatu ke satu kunci. Perluas mengganti prefiks dengan URI namespace lengkap dalam kurung kurawal, yang tidak ambigu dan itulah yang diinginkan konsumen yang ketat.

Apakah angka dan tanggal akan keluar sebagai angka?

Hanya jika Anda memintanya. Inferensi tipe mati secara bawaan karena XML tidak punya tipe dan menebak akan mengubah data: nomor pesanan yang ditulis 007 menjadi 7, awalan telepon +1 menjadi 1, dan versi 1.0 menjadi 1. Dengan inferensi aktif, bilangan bulat dan desimal sederhana, true, false, dan null dikonversi, sedangkan apa pun yang tidak akan selamat bolak-balik — nol di depan, tanda plus, nilai di luar rentang bilangan bulat aman, heksadesimal — sengaja dibiarkan sebagai teks.

Bagaimana jika XML saya tidak valid?

Anda mendapat nomor baris, kolom, baris sumber, dan penunjuk tepat di karakter yang bermasalah, disertai pesan yang menyebut masalahnya: tag penutup yang tidak cocok, ampersand tanpa escape, atribut ganda, prefiks namespace yang tidak dideklarasikan. Tautan ke alat JSON ke XML juga ditawarkan kalau ternyata Anda ingin arah sebaliknya.

Apakah gratis, dan seberapa besar berkas yang bisa diproses?

Konverter ini gratis dan semua fitur konversinya ikut gratis: kelima bentuk, kebijakan namespace, inferensi tipe, array paksa, dan seluruh pilihan indentasi. Versi gratis menangani satu berkas hingga 25 MB sekaligus. Pro mengonversi hingga 50 berkas sekaligus, mengirimkannya sebagai satu ZIP, tidak memberlakukan batas ukuran selain kemampuan perangkat Anda, dan menambahkan keluaran JSON Schema serta JSON per baris.

4.8dari 5

dari 82 penilaian

Beri nilai alat ini

Ketuk bintang — hanya sebentar