Bagaimana cara mengubah JSON ke XML atau XML ke JSON?
282
Saya mulai menggunakan Json.NET untuk mengkonversi string dalam format JSON ke objek atau sebaliknya. Saya tidak yakin dalam kerangka kerja Json.NET, apakah mungkin untuk mengubah string dalam JSON ke format XML dan sebaliknya?
Perhatikan seperti kata StaxMan, jika ada mantan. ruang di simpul elemen, itu akan diabaikan oleh xml. Misalnya "Student Id": 11000 tidak akan ada dalam hasil xml karena ruang dalam nama properti. xml tidak menerima ruang di dalam Elemen Node.
Daniel B
Jawaban:
424
Iya. Menggunakan kelas JsonConvert yang berisi metode pembantu untuk tujuan yang tepat ini:
// To convert an XML node contained in string xml into a JSON string XmlDocument doc =newXmlDocument();
doc.LoadXml(xml);string jsonText =JsonConvert.SerializeXmlNode(doc);// To convert JSON text contained in string json into an XML nodeXmlDocument doc =JsonConvert.DeserializeXmlNode(json);
Hanya FYI, ada masalah potensial di sini. Ketika saya mengubah array node xml ke json itu membuat array di json. Tetapi, ketika saya menjalankan melalui array xml node yang memiliki hitungan 1, maka konversi json tidak memformat array lagi. Array xml dengan elemen tunggal hilang dalam terjemahan di sini.
Levitikon
3
Kejutan kejutan - ini adalah impedansi antara XML dan JSON, dan alasan mengapa (IMO) bukan ide yang baik untuk langsung mengkonversi antara keduanya. Tapi, hei, ada banyak devs yang sangat tidak setuju di sini (sesuai dengan downvotes pada jawaban saya) dan tidak keberatan dengan konversi data yang tidak disengaja ini atau potensi kehilangan data ...
StaxMan
7
@StaxMan: Saya pikir semua orang bisa setuju bahwa tidak ada cara standar untuk mewakili dokumen XML dalam format JSON. Jawaban Anda mungkin diturunkan karena tidak benar-benar menjawab pertanyaan. OP tidak bertanya apakah dia harus melakukan konversi, tetapi apakah dia bisa melakukannya dengan menggunakan alat yang sudah dia miliki.
David Brown
46
Ya, Anda bisa melakukannya (saya lakukan) tetapi Waspadai beberapa paradoks saat mengkonversi, dan tangani dengan tepat. Anda tidak dapat secara otomatis menyesuaikan diri dengan semua kemungkinan antarmuka, dan ada dukungan bawaan yang terbatas dalam mengendalikan konversi - banyak struktur dan nilai JSON tidak dapat secara otomatis dikonversi dua arah. Ingatlah bahwa saya menggunakan pengaturan default dengan pustaka Newtonsoft JSON dan pustaka MS XML, sehingga jarak tempuh Anda dapat bervariasi:
XML -> JSON
Semua data menjadi data string (misalnya Anda akan selalu mendapatkan "false" bukan false atau "0" not 0 ) Jelas JavaScript memperlakukan ini secara berbeda dalam kasus-kasus tertentu.
Elemen anak-anak dapat menjadi objek {}bersarang ATAU nested-array [ {} {} ...]tergantung jika hanya ada satu atau lebih elemen XML anak. Anda akan mengkonsumsi dua ini secara berbeda dalam JavaScript, dll. Contoh XML yang berbeda sesuai dengan skema yang sama dapat menghasilkan struktur JSON yang berbeda dengan cara ini. Anda dapat menambahkan atribut json: Array = 'true' ke elemen Anda untuk mengatasinya dalam beberapa (tetapi tidak semua) kasus.
XML Anda harus dibentuk dengan cukup baik, saya perhatikan itu tidak harus benar-benar sesuai dengan standar W3C, tetapi 1. Anda harus memiliki elemen root dan 2. Anda tidak dapat memulai nama elemen dengan angka adalah dua dari standar XML yang dipaksakan Saya telah menemukan ketika menggunakan perpustakaan Newtonsoft dan MS.
Di versi yang lebih lama, elemen kosong tidak dikonversi ke JSON. Mereka diabaikan. Elemen kosong tidak menjadi "elemen": null
Anda memerlukan objek tingkat atas yang akan dikonversi ke elemen XML root atau parser akan gagal.
Nama objek Anda tidak dapat dimulai dengan angka, karena mereka tidak dapat dikonversi ke elemen (XML secara teknis bahkan lebih ketat dari ini) tetapi saya dapat 'lolos' dengan melanggar beberapa aturan penamaan elemen lainnya.
Jangan ragu untuk menyebutkan masalah lain yang Anda perhatikan, saya telah mengembangkan rutinitas kebiasaan saya sendiri untuk mempersiapkan dan membersihkan string saat saya mengkonversi bolak-balik. Situasi Anda mungkin atau mungkin tidak meminta persiapan / pembersihan. Seperti StaxMan menyebutkan, situasi Anda mungkin sebenarnya mengharuskan Anda mengkonversi antara objek ... ini bisa memerlukan antarmuka yang sesuai dan banyak pernyataan kasus / dll untuk menangani peringatan yang saya sebutkan di atas.
Ini! Penjabaran yang bagus atas dasar apa jawaban singkat saya (dan sangat downvoted) - ada banyak, banyak jebakan jika Anda melakukan konversi langsung buta. Mereka mungkin tidak memblokir masalah untuk penggunaan tertentu, tetapi juga bisa sangat buruk bagi orang lain.
StaxMan
1
Mengenai # 4 di XML -> JSON: Anda dapat menggunakan properti NullValueHandling untuk menentukan bahwa nilai nol harus dimasukkan secara eksplisit - newtonsoft.com/json/help/html/…
Jon Story
Deskripsi masalah dalam komentar ini berlaku dengan baik untuk SEMUA implementasi algoritma yang mengubah JSON menjadi XML atau sebaliknya. Setelah seseorang menerima bahwa tidak mungkin secara bersamaan mencapai kesetiaan dua arah yang sempurna, dan pada saat yang sama eter "pihak" atau "dibatasi" (skema / format yang ditentukan sebelumnya) input dan output. - dalam kasus umum.
DALDEI
33
Anda dapat melakukan konversi ini juga dengan .NET Framework:
Saya mendapatkan kesalahan pada GetXmlData "Nama 'GetXmlData' tidak ada dalam konteks saat ini" Apakah ada arahan penggunaan yang saya lewatkan?
TimSmith-Aardwolf
4
@ TimSmith-Aardwolf, Ini semua kode yang Anda butuhkan. Untuk menggunakan System.Web.Script.Serialisasi perlu menambahkan perakitan System.Web.Extensions dalam Referensi.
Termininja
@Termininja, JSON ke XML memberi saya ketik juga, bagaimana cara menghapusnya?
cracker
@Termininja, Sempurna, Terima kasih.
cracker
30
Saya tidak yakin ada gunanya konversi seperti itu (ya, banyak yang melakukannya, tetapi kebanyakan untuk memaksa pasak persegi melalui lubang bundar) - ada ketidakcocokan impedansi struktural, dan konversi adalah lossy. Jadi saya akan merekomendasikan terhadap transformasi format ke format.
Tetapi jika Anda melakukannya, pertama-tama konversikan dari json ke objek, kemudian dari objek ke xml (dan sebaliknya untuk arah sebaliknya). Melakukan transformasi langsung mengarah pada keluaran yang buruk, hilangnya informasi, atau mungkin keduanya.
Meskipun jawaban Anda hancur, saya senang itu ada di sini. Saya ingin melakukan konversi dan mempertimbangkan melewatkan objek tengah c #, tapi sekarang tidak begitu yakin. Saya perlu menghasilkan objek c # berdasarkan XSD sebaliknya dan karena itu akan murni hanya untuk tujuan konversi sepertinya lapisan yang terbuang (dan usaha). Jika Anda memiliki contoh atau detail lebih lanjut tentang cara lossy, akan lebih bagus untuk dilihat.
CRice
Tidak tahu mengapa ini diturunkan. Saat ini saya sedang memperbaiki banyak bug yang berhubungan dengan beberapa XML <-> JSON mengubah langkah-langkah dalam produk yang kami miliki. Sebagian besar adalah hilangnya tipe numerik ketika mengkonversi dari JSON ke XML.
rikkit
Kebenaran yang sulit, jawaban yang berguna.
FailedUnitTest
@ CLICE Sudah terlambat, tetapi memiliki objek transfer mempertahankan skema XML, sampai batas tertentu. Misalnya, seperti yang dibawa oleh Levitikon , jika Anda mencoba untuk mengkonversi dokumen XML dengan array elemen tunggal, konversi JSON tidak dapat mengetahui bahwa itu adalah array kecuali jika itu berasal dari objek transfer dengan tipe array.
jpaugh
1
XmlNodeConverter Newtonsoft.JSON memiliki opsi konfigurasi untuk menghindari masalah ini ketika mentransfer dari JSON ke XML kembali ke JSON, tetapi tidak dapat menangkap kasus di mana format aslinya adalah XML
jpaugh
27
Terima kasih atas jawaban David Brown . Dalam kasus saya JSON.Net 3.5, metode konversi berada di bawah kelas statis JsonConvert:
XmlNode myXmlNode =JsonConvert.DeserializeXmlNode(myJsonString);// is node not note// or .DeserilizeXmlNode(myJsonString, "root"); // if myJsonString does not have a rootstring jsonString =JsonConvert.SerializeXmlNode(myXmlNode);
Jika data Anda adalah array maka Anda perlu melakukan sesuatu seperti ini: JsonConvert.DeserializeXmlNode ("{\" Row \ ":" + json + "}", "root"). ToXmlString () jika tidak, Anda akan mendapatkan "XmlNodeConverter hanya dapat mengonversi JSON yang dimulai dengan objek. " pengecualian.
Mitchell Skurnik
Ya, dan Anda tidak dapat memulai dengan angka. JsonConvert.DeserializeXmlNode ("{\" 1Row \ ":" + json + "}", "root"). ToXmlString () akan gagal
DaFi4
jawaban di atas dan komentar @itchell membantu saya .. terima kasih
Ajay2707
8
Saya mencari waktu yang lama untuk menemukan kode alternatif untuk solusi yang diterima dengan harapan tidak menggunakan perakitan / proyek eksternal. Saya datang dengan berkat kode sumber proyek DynamicJson sebagai berikut :
publicXmlDocumentJsonToXML(string json){XmlDocument doc =newXmlDocument();using(var reader =JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(json),XmlDictionaryReaderQuotas.Max)){XElement xml =XElement.Load(reader);
doc.LoadXml(xml.ToString());}return doc;}
Catatan: Saya menginginkan XmlDocument daripada XElement untuk keperluan xPath. Juga, kode ini jelas hanya berjalan dari JSON ke XML, ada berbagai cara untuk melakukan yang sebaliknya.
Saya perlu melakukan ini baru-baru ini di SQLCLR dan tidak dapat mengambil ketergantungan jadi saya hanya sedikit dan menulis rutin konversi json-to-xml ini , ternyata sangat sederhana dan hanya sekitar 20 baris kode.
Gordy
cara menghapus typr dari xml?
cracker
6
Berikut adalah kode c # lengkap untuk mengonversi xml ke json
publicstaticclassJSon{publicstaticstringXmlToJSON(string xml){XmlDocument doc =newXmlDocument();
doc.LoadXml(xml);returnXmlToJSON(doc);}publicstaticstringXmlToJSON(XmlDocument xmlDoc){StringBuilder sbJSON =newStringBuilder();
sbJSON.Append("{ ");XmlToJSONnode(sbJSON, xmlDoc.DocumentElement,true);
sbJSON.Append("}");return sbJSON.ToString();}// XmlToJSONnode: Output an XmlElement, possibly as part of a higher arrayprivatestaticvoidXmlToJSONnode(StringBuilder sbJSON,XmlElement node,bool showNodeName){if(showNodeName)
sbJSON.Append("\""+SafeJSON(node.Name)+"\": ");
sbJSON.Append("{");// Build a sorted list of key-value pairs// where key is case-sensitive nodeName// value is an ArrayList of string or XmlElement// so that we know whether the nodeName is an array or not.SortedList<string,object> childNodeNames =newSortedList<string,object>();// Add in all node attributesif(node.Attributes!=null)foreach(XmlAttribute attr in node.Attributes)StoreChildNode(childNodeNames, attr.Name, attr.InnerText);// Add in all nodesforeach(XmlNode cnode in node.ChildNodes){if(cnode isXmlText)StoreChildNode(childNodeNames,"value", cnode.InnerText);elseif(cnode isXmlElement)StoreChildNode(childNodeNames, cnode.Name, cnode);}// Now output all stored infoforeach(string childname in childNodeNames.Keys){List<object> alChild =(List<object>)childNodeNames[childname];if(alChild.Count==1)OutputNode(childname, alChild[0], sbJSON,true);else{
sbJSON.Append(" \""+SafeJSON(childname)+"\": [ ");foreach(objectChildin alChild)OutputNode(childname,Child, sbJSON,false);
sbJSON.Remove(sbJSON.Length-2,2);
sbJSON.Append(" ], ");}}
sbJSON.Remove(sbJSON.Length-2,2);
sbJSON.Append(" }");}// StoreChildNode: Store data associated with each nodeName// so that we know whether the nodeName is an array or not.privatestaticvoidStoreChildNode(SortedList<string,object> childNodeNames,string nodeName,object nodeValue){// Pre-process contraction of XmlElement-sif(nodeValue isXmlElement){// Convert <aa></aa> into "aa":null// <aa>xx</aa> into "aa":"xx"XmlNode cnode =(XmlNode)nodeValue;if(cnode.Attributes.Count==0){XmlNodeList children = cnode.ChildNodes;if(children.Count==0)
nodeValue =null;elseif(children.Count==1&&(children[0]isXmlText))
nodeValue =((XmlText)(children[0])).InnerText;}}// Add nodeValue to ArrayList associated with each nodeName// If nodeName doesn't exist then add itList<object>ValuesAL;if(childNodeNames.ContainsKey(nodeName)){ValuesAL=(List<object>)childNodeNames[nodeName];}else{ValuesAL=newList<object>();
childNodeNames[nodeName]=ValuesAL;}ValuesAL.Add(nodeValue);}privatestaticvoidOutputNode(string childname,object alChild,StringBuilder sbJSON,bool showNodeName){if(alChild ==null){if(showNodeName)
sbJSON.Append("\""+SafeJSON(childname)+"\": ");
sbJSON.Append("null");}elseif(alChild isstring){if(showNodeName)
sbJSON.Append("\""+SafeJSON(childname)+"\": ");string sChild =(string)alChild;
sChild = sChild.Trim();
sbJSON.Append("\""+SafeJSON(sChild)+"\"");}elseXmlToJSONnode(sbJSON,(XmlElement)alChild, showNodeName);
sbJSON.Append(", ");}// Make a string safe for JSONprivatestaticstringSafeJSON(string sIn){StringBuilder sbOut =newStringBuilder(sIn.Length);foreach(char ch in sIn){if(Char.IsControl(ch)|| ch =='\''){int ich =(int)ch;
sbOut.Append(@"\u"+ ich.ToString("x4"));continue;}elseif(ch =='\"'|| ch =='\\'|| ch =='/'){
sbOut.Append('\\');}
sbOut.Append(ch);}return sbOut.ToString();}}
Untuk mengonversi string XML yang diberikan ke JSON, cukup panggil fungsi XmlToJSON () seperti di bawah ini.
Berikut ini cuplikan sederhana yang mengubah XmlNode (secara rekursif) menjadi hashtable, dan mengelompokkan beberapa instance dari anak yang sama ke dalam array (sebagai ArrayList). Hashtable biasanya diterima untuk dikonversi ke JSON oleh sebagian besar pustaka JSON.
Saya memang suka kata David Brown tapi saya mendapat pengecualian berikut.
$exception {"There are multiple root elements. Line , position ."}System.Xml.XmlException
Salah satu solusinya adalah dengan memodifikasi file XML dengan elemen root tetapi itu tidak selalu diperlukan dan untuk aliran XML mungkin juga tidak mungkin. Solusi saya di bawah ini:
<parent><child>
Text
</child></parent><parent><child><grandchild>
Text
</grandchild><grandchild>
Text
</grandchild></child><child>
Text
</child></parent>
Jawaban:
Iya. Menggunakan kelas JsonConvert yang berisi metode pembantu untuk tujuan yang tepat ini:
Dokumentasi di sini: Konversi antara JSON dan XML dengan Json.NET
sumber
Ya, Anda bisa melakukannya (saya lakukan) tetapi Waspadai beberapa paradoks saat mengkonversi, dan tangani dengan tepat. Anda tidak dapat secara otomatis menyesuaikan diri dengan semua kemungkinan antarmuka, dan ada dukungan bawaan yang terbatas dalam mengendalikan konversi - banyak struktur dan nilai JSON tidak dapat secara otomatis dikonversi dua arah. Ingatlah bahwa saya menggunakan pengaturan default dengan pustaka Newtonsoft JSON dan pustaka MS XML, sehingga jarak tempuh Anda dapat bervariasi:
XML -> JSON
{}
bersarang ATAU nested-array[ {} {} ...]
tergantung jika hanya ada satu atau lebih elemen XML anak. Anda akan mengkonsumsi dua ini secara berbeda dalam JavaScript, dll. Contoh XML yang berbeda sesuai dengan skema yang sama dapat menghasilkan struktur JSON yang berbeda dengan cara ini. Anda dapat menambahkan atribut json: Array = 'true' ke elemen Anda untuk mengatasinya dalam beberapa (tetapi tidak semua) kasus.Pembaruan baru mengubah ini (Terima kasih kepada Jon Story karena menunjukkannya): https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm
JSON -> XML
Jangan ragu untuk menyebutkan masalah lain yang Anda perhatikan, saya telah mengembangkan rutinitas kebiasaan saya sendiri untuk mempersiapkan dan membersihkan string saat saya mengkonversi bolak-balik. Situasi Anda mungkin atau mungkin tidak meminta persiapan / pembersihan. Seperti StaxMan menyebutkan, situasi Anda mungkin sebenarnya mengharuskan Anda mengkonversi antara objek ... ini bisa memerlukan antarmuka yang sesuai dan banyak pernyataan kasus / dll untuk menangani peringatan yang saya sebutkan di atas.
sumber
Anda dapat melakukan konversi ini juga dengan .NET Framework:
JSON ke XML: dengan menggunakan System.Runtime.Serialization.Json
XML ke JSON: dengan menggunakan System.Web.Script.Serialization
sumber
Saya tidak yakin ada gunanya konversi seperti itu (ya, banyak yang melakukannya, tetapi kebanyakan untuk memaksa pasak persegi melalui lubang bundar) - ada ketidakcocokan impedansi struktural, dan konversi adalah lossy. Jadi saya akan merekomendasikan terhadap transformasi format ke format.
Tetapi jika Anda melakukannya, pertama-tama konversikan dari json ke objek, kemudian dari objek ke xml (dan sebaliknya untuk arah sebaliknya). Melakukan transformasi langsung mengarah pada keluaran yang buruk, hilangnya informasi, atau mungkin keduanya.
sumber
Terima kasih atas jawaban David Brown . Dalam kasus saya JSON.Net 3.5, metode konversi berada di bawah kelas statis JsonConvert:
sumber
Saya mencari waktu yang lama untuk menemukan kode alternatif untuk solusi yang diterima dengan harapan tidak menggunakan perakitan / proyek eksternal. Saya datang dengan berkat kode sumber proyek DynamicJson sebagai berikut :
Catatan: Saya menginginkan XmlDocument daripada XElement untuk keperluan xPath. Juga, kode ini jelas hanya berjalan dari JSON ke XML, ada berbagai cara untuk melakukan yang sebaliknya.
sumber
Berikut adalah kode c # lengkap untuk mengonversi xml ke json
Untuk mengonversi string XML yang diberikan ke JSON, cukup panggil fungsi XmlToJSON () seperti di bawah ini.
sumber
Coba fungsi ini. Saya baru saja menulis dan belum punya banyak kesempatan untuk mengujinya, tetapi tes pendahuluan saya menjanjikan.
sumber
Berikut ini cuplikan sederhana yang mengubah XmlNode (secara rekursif) menjadi hashtable, dan mengelompokkan beberapa instance dari anak yang sama ke dalam array (sebagai ArrayList). Hashtable biasanya diterima untuk dikonversi ke JSON oleh sebagian besar pustaka JSON.
sumber
Cinchoo ETL - perpustakaan open source yang tersedia untuk melakukan konversi Xml ke JSON dengan mudah dengan beberapa baris kode
Xml -> JSON:
JSON -> Xml:
Periksa artikel CodeProject Project untuk bantuan tambahan.
Penafian: Saya penulis perpustakaan ini.
sumber
Saya memang suka kata David Brown tapi saya mendapat pengecualian berikut.
Salah satu solusinya adalah dengan memodifikasi file XML dengan elemen root tetapi itu tidak selalu diperlukan dan untuk aliran XML mungkin juga tidak mungkin. Solusi saya di bawah ini:
Contoh XML yang menghasilkan kesalahan:
sumber
Saya telah menggunakan metode di bawah ini untuk mengkonversi JSON ke XML
Dan
Saya telah menggunakan kelas bernama Item untuk mewakili elemen
Berhasil....
sumber
Untuk mengonversi
JSON
string untukXML
mencoba ini:Untuk mengkonversi
XML
keJSON
mencoba ini:sumber
menggunakan perpustakaan pihak ketiga, alih-alih menulis kode sendiri untuk mem-parsing JSON atau XML String. Jika sekali pakai, cobalah untuk mengubahnya secara online. Json to Xml https://www.easycodeforall.com/Json2Xml.jsp Xml to Json https://www.easycodeforall.com/Xml2Json.jsp
sumber