วิธีแปลง JSON เป็น XML หรือ XML เป็น JSON


282

ฉันเริ่มใช้ Json.NET เพื่อแปลงสตริงในรูปแบบ JSON เป็น object หรือ viceversa ฉันไม่แน่ใจในกรอบ Json.NET เป็นไปได้ไหมที่จะแปลงสตริงใน JSON เป็นรูปแบบ XML และ viceversa?


หมายเหตุตามที่ StaxMan กล่าวหากมีอดีต ช่องว่างในโหนดองค์ประกอบจะถูกละเว้นโดย xml สำหรับอดีต "รหัสนักศึกษา": 11000 จะไม่อยู่ในผลลัพธ์ xml bcuz ของพื้นที่ในชื่อคุณสมบัติ xml ไม่ยอมรับว่ามีช่องว่างใน Element Node
Daniel B

คำตอบ:


424

ใช่. การใช้คลาส JsonConvert ซึ่งมีวิธีการช่วยเหลือเพื่อวัตถุประสงค์ที่แม่นยำนี้:

// To convert an XML node contained in string xml into a JSON string   
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

// To convert JSON text contained in string json into an XML node
XmlDocument doc = JsonConvert.DeserializeXmlNode(json);

เอกสารประกอบที่นี่: การแปลงระหว่าง JSON และ XML ด้วย Json.NET


3
ฉันหาชั้นนี้ไม่เจอ ฉันใช้ NewtonSoft Json.net 3.5
David.Chu.ca

3
แต่ดูเหมือนว่ามันฟังก์ชั่นนี้ได้รับการย้ายไปอยู่ที่ระดับ Newtonsoft.Json.Converters.XmlNodeConverter ใน JSON.NET 3.5: james.newtonking.com/projects/json/help/html/...
เดวิดบราวน์

3
เพียงแค่ FYI มีปัญหาที่อาจเกิดขึ้นที่นี่ เมื่อฉันเปลี่ยนอาร์เรย์ของโหนด xml เป็น json มันกำลังสร้างอาร์เรย์เป็น json แต่เมื่อฉันเรียกใช้อาร์เรย์ของโหนด xml ที่มีจำนวน 1 การแปลง json จะไม่ฟอร์แมตอาร์เรย์อีกต่อไป อาร์เรย์ xml ที่มีองค์ประกอบเดียวหายไปจากการแปลที่นี่
Levitikon

3
แปลกใจแปลกใจ - นี่คือความต้านทานระหว่าง XML และ JSON และเหตุผลที่ว่าทำไมมันเป็น (IMO) ไม่เป็นความคิดที่ดีที่จะโดยตรงแปลงระหว่างคนทั้งสอง แต่เดี๋ยวก่อนมี devs จำนวนมากที่ไม่เห็นด้วยอย่างยิ่งที่นี่ (ตาม downvotes ในคำตอบของฉัน) และไม่รังเกียจการแปลงข้อมูลอุบัติเหตุเหล่านี้หรือการสูญเสียข้อมูลที่อาจเกิดขึ้น ...
StaxMan

7
@StaxMan: ฉันคิดว่าทุกคนสามารถยอมรับว่าไม่มีวิธีมาตรฐานในการแสดงเอกสาร XML ในรูปแบบ JSON คำตอบของคุณอาจถูกลดระดับลงเนื่องจากไม่ได้ตอบคำถาม สหกรณ์ก็ไม่ได้ถามว่าเขาควรทำแปลง แต่ถ้าเขาสามารถทำมันได้โดยใช้เครื่องมือที่มีอยู่แล้วในการกำจัดของเขา
David Brown

46

ใช่คุณสามารถทำได้ (ฉันทำได้) แต่ระวังความขัดแย้งบางอย่างเมื่อแปลงและจัดการอย่างเหมาะสม คุณไม่สามารถปฏิบัติตามอินเทอร์เฟซที่เป็นไปได้ทั้งหมดโดยอัตโนมัติและมีการสนับสนุนในตัวที่ จำกัด ในการควบคุมการแปลงโครงสร้างและค่า JSON จำนวนมากไม่สามารถแปลงทั้งสองวิธีได้โดยอัตโนมัติ โปรดทราบว่าฉันใช้การตั้งค่าเริ่มต้นกับห้องสมุด Newtonsoft JSON และห้องสมุด MS XML ดังนั้นระยะของคุณอาจแตกต่างกันไป:

XML -> JSON

  1. ข้อมูลทั้งหมดจะกลายเป็นข้อมูลสตริง (ตัวอย่างเช่นคุณจะได้รับ"false"ไม่ใช่เท็จหรือ"0"ไม่ใช่0 ) แน่นอน JavaScript ใช้สิ่งเหล่านี้แตกต่างกันในบางกรณี
  2. องค์ประกอบลูกสามารถกลายเป็นวัตถุ{}ซ้อนกันหรือซ้อนกัน[ {} {} ...]ขึ้นอยู่กับว่ามีองค์ประกอบลูก XML เพียงหนึ่งหรือมากกว่าหนึ่งองค์ประกอบ คุณจะใช้สองสิ่งนี้แตกต่างกันใน JavaScript และตัวอย่างอื่น ๆ ของ XML ที่สอดคล้องกับสคีมาเดียวกันสามารถสร้างโครงสร้าง JSON ที่แตกต่างกันจริง ๆ ด้วยวิธีนี้ คุณสามารถเพิ่มแอตทริบิวต์json: Array = 'true'ให้กับองค์ประกอบของคุณเพื่อแก้ไขปัญหานี้ในบางกรณี (แต่ไม่จำเป็นต้องทั้งหมด)
  3. XML ของคุณต้องมีรูปแบบค่อนข้างดีฉันสังเกตเห็นว่าไม่จำเป็นต้องสอดคล้องกับมาตรฐาน W3C อย่างสมบูรณ์แบบ แต่ 1. คุณต้องมีองค์ประกอบรากและ 2 คุณไม่สามารถเริ่มชื่อองค์ประกอบด้วยตัวเลขเป็นสองมาตรฐาน XML ที่บังคับใช้ ฉันพบเมื่อใช้ห้องสมุด Newtonsoft และ MS
  4. ในเวอร์ชันที่เก่ากว่าองค์ประกอบเปล่าจะไม่แปลงเป็น JSON พวกเขาจะถูกละเว้น องค์ประกอบว่างเปล่าไม่กลายเป็น"องค์ประกอบ": null

การอัปเดตใหม่จะเปลี่ยนสิ่งนี้ (ขอบคุณ Jon Story สำหรับการชี้ให้เห็น): https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm

JSON -> XML

  1. คุณต้องมีวัตถุระดับบนสุดที่จะแปลงเป็นองค์ประกอบ XML รูทหรือโปรแกรมแยกวิเคราะห์จะล้มเหลว
  2. ชื่อวัตถุของคุณไม่สามารถขึ้นต้นด้วยตัวเลขได้เนื่องจากไม่สามารถแปลงเป็นองค์ประกอบ (XML เป็นเทคนิคที่เข้มงวดยิ่งกว่านี้) แต่ฉันสามารถ 'หนี' ด้วยการทำลายกฎการตั้งชื่อองค์ประกอบอื่น ๆ

โปรดอย่าลังเลที่จะพูดถึงปัญหาอื่น ๆ ที่คุณสังเกตเห็นว่าฉันได้พัฒนากิจวัตรที่กำหนดเองของฉันเองสำหรับการเตรียมและทำความสะอาดสายอักขระขณะที่ฉันแปลงไปมา สถานการณ์ของคุณอาจหรือไม่อาจเรียกร้องให้มีการเตรียมการ / ทำความสะอาด ตามที่ StaxMan กล่าวถึงสถานการณ์ของคุณอาจต้องการให้คุณแปลงระหว่างออบเจ็กต์ ... สิ่งนี้อาจนำมาซึ่งส่วนต่อประสานที่เหมาะสม


นี้! คำตอบสั้น ๆ ของฉัน (และลดลงอย่างมากในบางจุด) เป็นคำตอบที่ดีขึ้นอยู่กับว่า - มีข้อผิดพลาดมากมายหากคุณเปลี่ยนใจเลื่อมใสตาบอด พวกเขาอาจไม่ได้ปิดกั้นปัญหาสำหรับการใช้งานที่เฉพาะเจาะจง แต่ก็อาจเป็นเรื่องน่ารังเกียจสำหรับผู้อื่น
StaxMan

1
เกี่ยวกับ # 4 บน XML -> JSON: คุณสามารถใช้คุณสมบัติ NullValueHandling เพื่อระบุว่าค่า Null ควรรวมไว้อย่างชัดเจน - newtonsoft.com/json/help/html/…
Jon Story

คำอธิบายปัญหาในคำอธิบายนี้ใช้ได้ดีกับการใช้อัลกอริทึมทั้งหมดซึ่งแปลง JSON เป็น XML หรือย้อนกลับ เมื่อเรายอมรับว่ามันเป็นไปไม่ได้ที่จะบรรลุความสมบูรณ์แบบสองทิศทางในเวลาเดียวกันและในเวลาเดียวกันอีเธอร์ "ปาร์ตี้" หรือ "ถูก จำกัด " (สคีมา / รูปแบบที่กำหนดไว้ล่วงหน้า) - ในกรณีทั่วไป
DALDEI

33

คุณสามารถทำการแปลงเหล่านี้ได้ด้วย. NET Framework:

JSON เป็น XML:โดยใช้System.Runtime.Serialization.Json

var xml = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(
    Encoding.ASCII.GetBytes(jsonString), new XmlDictionaryReaderQuotas()));

XML เป็น JSON:โดยใช้System.Web.Script.Serialization

var json = new JavaScriptSerializer().Serialize(GetXmlData(XElement.Parse(xmlString)));

private static Dictionary<string, object> GetXmlData(XElement xml)
{
    var attr = xml.Attributes().ToDictionary(d => d.Name.LocalName, d => (object)d.Value);
    if (xml.HasElements) attr.Add("_value", xml.Elements().Select(e => GetXmlData(e)));
    else if (!xml.IsEmpty) attr.Add("_value", xml.Value);

    return new Dictionary<string, object> { { xml.Name.LocalName, attr } };
}

ฉันได้รับข้อผิดพลาดใน GetXmlData "ชื่อ 'GetXmlData' ไม่มีอยู่ในบริบทปัจจุบัน" มีคำสั่งที่ใช้หายไปหรือไม่?
TimSmith-Aardwolf

4
@ TimSmith-Aardwolf นี่คือรหัสทั้งหมดที่คุณต้องการ สำหรับการใช้ System.Web.Script.Serializationจำเป็นต้องเพิ่มแอสเซมบลีSystem.Web.Extensionsในการอ้างอิง
Termininja

@Termininja, JSON เป็น XML ให้ฉันพิมพ์ด้วยวิธีการลบมันได้อย่างไร
แครกเกอร์

@Termininja, สมบูรณ์แบบขอบคุณ
แครกเกอร์

30

ฉันไม่แน่ใจว่ามีจุดในการแปลงเช่นนี้ (ใช่หลายคนทำ แต่ส่วนใหญ่จะบังคับหมุดสี่เหลี่ยมผ่านรูกลม) - มีความต้านทานเชิงโครงสร้างไม่ตรงกันและการแปลงจะสูญเสีย ดังนั้นฉันจะแนะนำกับการแปลงรูปแบบเพื่อจัดรูปแบบดังกล่าว

แต่ถ้าคุณทำก่อนอื่นให้แปลงจาก json เป็น object แล้วเปลี่ยนจาก object เป็น xml (และกลับกันสำหรับทิศทางกลับกัน) การแปลงโดยตรงจะนำไปสู่ผลลัพธ์ที่น่าเกลียดการสูญเสียข้อมูลหรืออาจเป็นได้ทั้งสองอย่าง


1
แม้ว่าคำตอบของคุณจะถูกทุบฉันก็ดีใจที่ได้มา ฉันต้องการทำการแปลงและกำลังพิจารณาข้ามวัตถุ c # middle แต่ตอนนี้ไม่แน่ใจ ฉันจะต้องสร้างวัตถุ c # ตาม XSD เป็นอย่างอื่นและเนื่องจากมันเป็นเพียงจุดประสงค์ในการแปลงเท่านั้นจึงดูเหมือนว่าเลเยอร์ที่สูญเปล่า (และความพยายาม) หากคุณมีตัวอย่างหรือรายละเอียดเพิ่มเติมเกี่ยวกับการสูญเสียที่จะได้เห็น
CRice

ไม่ทราบว่าทำไมสิ่งนี้จึงถูกลดระดับลง ขณะนี้ฉันกำลังแก้ไขข้อบกพร่องหลายอย่างที่เกี่ยวข้องกับ XML <-> JSON หลายรายการที่เปลี่ยนขั้นตอนในผลิตภัณฑ์ที่เรามี ส่วนใหญ่ลดการสูญเสียประเภทตัวเลขเมื่อแปลงจาก JSON เป็น XML
rikkit

ความจริงที่ยากคำตอบที่มีประโยชน์
FailedUnitTest

@CRice ปีที่ผ่านมาสายเกินไป แต่การถ่ายโอนออบเจ็กต์เก็บรักษา XML schema ในระดับหนึ่ง ตัวอย่างเช่นนำโดย Levitikonหากคุณพยายามแปลงเอกสาร XML ด้วยอาร์เรย์องค์ประกอบเดียวการแปลง JSON ไม่สามารถรู้ได้ว่ามันเป็นอาร์เรย์เว้นแต่ว่ามาจากวัตถุการถ่ายโอนที่มีประเภทอาร์เรย์
jpaugh

1
XmlNodeConverter ของNewtonsoft.JSONมีตัวเลือกการกำหนดค่าเพื่อหลีกเลี่ยงปัญหานี้เมื่อถ่ายโอนจาก JSON ไปยัง XML กลับไปที่ JSON แต่ไม่สามารถตรวจจับกรณีที่รูปแบบดั้งเดิมคือ XML
jpaugh

27

ขอบคุณสำหรับเดวิดบราวน์คำตอบ ในกรณีของฉันของ JSON.Net 3.5 วิธีการแปลงอยู่ภายใต้ JsonConvert คลาสคงที่:

XmlNode myXmlNode = JsonConvert.DeserializeXmlNode(myJsonString); // is node not note
// or .DeserilizeXmlNode(myJsonString, "root"); // if myJsonString does not have a root
string jsonString = JsonConvert.SerializeXmlNode(myXmlNode);

4
หากข้อมูลของคุณเป็นอาร์เรย์คุณต้องทำดังนี้: JsonConvert.DeserializeXmlNode ("{\" Row \ ":" + json + "}", "root") ToXmlString () มิฉะนั้นคุณจะได้รับ "XmlNodeConverter สามารถแปลง JSON ที่ขึ้นต้นด้วยวัตถุเท่านั้น " ข้อยกเว้น
Mitchell Skurnik

ใช่และคุณไม่สามารถเริ่มต้นด้วยตัวเลข JsonConvert.DeserializeXmlNode ("{\" 1Row \ ":" + json + "}", "root") ToXmlString () จะล้มเหลว
DaFi4

คำตอบข้างต้นและ @mitchell ความคิดเห็นช่วยฉัน .. ขอบคุณ
Ajay2707

8

ฉันค้นหาเป็นเวลานานเพื่อค้นหารหัสทางเลือกไปยังโซลูชันที่ยอมรับในความหวังที่จะไม่ใช้แอสเซมบลี / โครงการภายนอก ฉันมาด้วยต่อไปนี้ต้องขอบคุณรหัสแหล่งที่มาของโครงการDynamicJson :

public XmlDocument JsonToXML(string json)
{
    XmlDocument doc = new XmlDocument();

    using (var reader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(json), XmlDictionaryReaderQuotas.Max))
    {
        XElement xml = XElement.Load(reader);
        doc.LoadXml(xml.ToString());
    }

    return doc;
}

หมายเหตุ: ฉันต้องการ XmlDocument มากกว่า XElement สำหรับวัตถุประสงค์ xPath นอกจากนี้รหัสนี้เห็นได้ชัดจาก JSON ไปยัง XML เท่านั้นมีหลายวิธีในการทำตรงกันข้าม


1
ฉันต้องทำสิ่งนี้ใน SQLCLR เมื่อเร็ว ๆ นี้และไม่สามารถพึ่งพาได้ดังนั้นฉันเพียงแค่กระสุนและเขียนรูทีนการแปลง json-to-xmlนี้มันง่ายอย่างน่าประหลาดใจและมีรหัสประมาณ 20 บรรทัดเท่านั้น
gordy

วิธีลบ typr จาก xml
แครกเกอร์

6

นี่คือรหัสเต็ม c # ในการแปลง xml เป็น json

public static class JSon
{
public static string XmlToJSON(string xml)
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);

    return XmlToJSON(doc);
}
public static string XmlToJSON(XmlDocument xmlDoc)
{
    StringBuilder sbJSON = new StringBuilder();
    sbJSON.Append("{ ");
    XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);
    sbJSON.Append("}");
    return sbJSON.ToString();
}

//  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array
private static void XmlToJSONnode(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 = new SortedList<string, object>();

    //  Add in all node attributes
    if (node.Attributes != null)
        foreach (XmlAttribute attr in node.Attributes)
            StoreChildNode(childNodeNames, attr.Name, attr.InnerText);

    //  Add in all nodes
    foreach (XmlNode cnode in node.ChildNodes)
    {
        if (cnode is XmlText)
            StoreChildNode(childNodeNames, "value", cnode.InnerText);
        else if (cnode is XmlElement)
            StoreChildNode(childNodeNames, cnode.Name, cnode);
    }

    // Now output all stored info
    foreach (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 (object Child in 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.
private static void StoreChildNode(SortedList<string, object> childNodeNames, string nodeName, object nodeValue)
{
    // Pre-process contraction of XmlElement-s
    if (nodeValue is XmlElement)
    {
        // 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;
            else if (children.Count == 1 && (children[0] is XmlText))
                nodeValue = ((XmlText)(children[0])).InnerText;
        }
    }
    // Add nodeValue to ArrayList associated with each nodeName
    // If nodeName doesn't exist then add it
    List<object> ValuesAL;

    if (childNodeNames.ContainsKey(nodeName))
    {
        ValuesAL = (List<object>)childNodeNames[nodeName];
    }
    else
    {
        ValuesAL = new List<object>();
        childNodeNames[nodeName] = ValuesAL;
    }
    ValuesAL.Add(nodeValue);
}

private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)
{
    if (alChild == null)
    {
        if (showNodeName)
            sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
        sbJSON.Append("null");
    }
    else if (alChild is string)
    {
        if (showNodeName)
            sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
        string sChild = (string)alChild;
        sChild = sChild.Trim();
        sbJSON.Append("\"" + SafeJSON(sChild) + "\"");
    }
    else
        XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);
    sbJSON.Append(", ");
}

// Make a string safe for JSON
private static string SafeJSON(string sIn)
{
    StringBuilder sbOut = new StringBuilder(sIn.Length);
    foreach (char ch in sIn)
    {
        if (Char.IsControl(ch) || ch == '\'')
        {
            int ich = (int)ch;
            sbOut.Append(@"\u" + ich.ToString("x4"));
            continue;
        }
        else if (ch == '\"' || ch == '\\' || ch == '/')
        {
            sbOut.Append('\\');
        }
        sbOut.Append(ch);
    }
    return sbOut.ToString();
 }
}

ในการแปลงสตริง XML ที่กำหนดให้เป็น JSON เพียงแค่เรียก XmlToJSON () ฟังก์ชั่นดังต่อไปนี้

string xml = "<menu id=\"file\" value=\"File\"> " +
              "<popup>" +
                "<menuitem value=\"New\" onclick=\"CreateNewDoc()\" />" +
                "<menuitem value=\"Open\" onclick=\"OpenDoc()\" />" +
                "<menuitem value=\"Close\" onclick=\"CloseDoc()\" />" +
              "</popup>" +
            "</menu>";

string json = JSON.XmlToJSON(xml);
// json = { "menu": {"id": "file", "popup": { "menuitem": [ {"onclick": "CreateNewDoc()", "value": "New" }, {"onclick": "OpenDoc()", "value": "Open" }, {"onclick": "CloseDoc()", "value": "Close" } ] }, "value": "File" }}

3

ลองใช้ฟังก์ชั่นนี้ ฉันเพิ่งเขียนและไม่ได้มีโอกาสทดสอบได้มากนัก แต่การทดสอบเบื้องต้นของฉันมีแนวโน้ม

public static XmlDocument JsonToXml(string json)
{
    XmlNode newNode = null;
    XmlNode appendToNode = null;
    XmlDocument returnXmlDoc = new XmlDocument();
    returnXmlDoc.LoadXml("<Document />");
    XmlNode rootNode = returnXmlDoc.SelectSingleNode("Document");
    appendToNode = rootNode;

    string[] arrElementData;
    string[] arrElements = json.Split('\r');
    foreach (string element in arrElements)
    {
        string processElement = element.Replace("\r", "").Replace("\n", "").Replace("\t", "").Trim();
        if ((processElement.IndexOf("}") > -1 || processElement.IndexOf("]") > -1) && appendToNode != rootNode)
        {
            appendToNode = appendToNode.ParentNode;
        }
        else if (processElement.IndexOf("[") > -1)
        {
            processElement = processElement.Replace(":", "").Replace("[", "").Replace("\"", "").Trim();
            newNode = returnXmlDoc.CreateElement(processElement);
            appendToNode.AppendChild(newNode);
            appendToNode = newNode;
        }
        else if (processElement.IndexOf("{") > -1 && processElement.IndexOf(":") > -1)
        {
            processElement = processElement.Replace(":", "").Replace("{", "").Replace("\"", "").Trim();
            newNode = returnXmlDoc.CreateElement(processElement);
            appendToNode.AppendChild(newNode);
            appendToNode = newNode;
        }
        else
        {
            if (processElement.IndexOf(":") > -1)
            {
                arrElementData = processElement.Replace(": \"", ":").Replace("\",", "").Replace("\"", "").Split(':');
                newNode = returnXmlDoc.CreateElement(arrElementData[0]);
                for (int i = 1; i < arrElementData.Length; i++)
                {
                    newNode.InnerText += arrElementData[i];
                }

                appendToNode.AppendChild(newNode);
            }
        }
    }

    return returnXmlDoc;
}

2

นี่คือตัวอย่างง่ายๆที่แปลง XmlNode (เรียกซ้ำ) เป็น hashtable และจัดกลุ่มอินสแตนซ์หลายรายการของชายน์เดียวกันให้เป็นอาร์เรย์ (เป็น ArrayList) โดยปกติแล้ว Hashtable จะยอมรับการแปลงเป็น JSON โดยส่วนใหญ่ของไลบรารี JSON

protected object convert(XmlNode root){
    Hashtable obj = new Hashtable();
    for(int i=0,n=root.ChildNodes.Count;i<n;i++){
        object result = null;
        XmlNode current = root.ChildNodes.Item(i);

        if(current.NodeType != XmlNodeType.Text)
            result = convert(current);
        else{
            int resultInt;
            double resultFloat;
            bool resultBoolean;
            if(Int32.TryParse(current.Value, out resultInt)) return resultInt;
            if(Double.TryParse(current.Value, out resultFloat)) return resultFloat;
            if(Boolean.TryParse(current.Value, out resultBoolean)) return resultBoolean;
            return current.Value;
        }

        if(obj[current.Name] == null)
            obj[current.Name] = result;
        else if(obj[current.Name].GetType().Equals(typeof(ArrayList)))
            ((ArrayList)obj[current.Name]).Add(result);
        else{
            ArrayList collision = new ArrayList();
            collision.Add(obj[current.Name]);
            collision.Add(result);
            obj[current.Name] = collision;
        }
    }

    return obj;
}

1

Cinchoo ETL - ไลบรารีโอเพ่นซอร์สที่พร้อมให้ทำการแปลง Xml เป็น JSON ได้อย่างง่ายดายด้วยโค้ดไม่กี่บรรทัด

Xml -> JSON:

using (var p = new ChoXmlReader("sample.xml"))
{
    using (var w = new ChoJSONWriter("sample.json"))
    {
        w.Write(p);
    }
}

JSON -> Xml:

using (var p = new ChoJsonReader("sample.json"))
{
    using (var w = new ChoXmlWriter("sample.xml"))
    {
        w.Write(p);
    }
}

บทความ Checkout CodeProject เพื่อขอความช่วยเหลือเพิ่มเติม

คำเตือน: ฉันเป็นผู้เขียนของห้องสมุดนี้


0

ฉันชอบ David Brown พูด แต่ฉันได้รับข้อยกเว้นดังต่อไปนี้

$exception {"There are multiple root elements. Line , position ."} System.Xml.XmlException

ทางออกหนึ่งคือแก้ไขไฟล์ XML ด้วยองค์ประกอบรูท แต่ไม่จำเป็นเสมอไปและสำหรับสตรีม XML อาจไม่สามารถทำได้เช่นกัน โซลูชันของฉันด้านล่าง:

var path = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\App_Data"));
var directoryInfo = new DirectoryInfo(path);
var fileInfos = directoryInfo.GetFiles("*.xml");

foreach (var fileInfo in fileInfos)
{
    XmlDocument doc = new XmlDocument();
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ConformanceLevel = ConformanceLevel.Fragment;

    using (XmlReader reader = XmlReader.Create(fileInfo.FullName, settings))
    {
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            {
                var node = doc.ReadNode(reader);
                string json = JsonConvert.SerializeXmlNode(node);
            }
        }
    }
}

ตัวอย่าง XML ที่สร้างข้อผิดพลาด:

<parent>
    <child>
        Text
    </child>
</parent>
<parent>
    <child>
        <grandchild>
            Text
        </grandchild>
        <grandchild>
            Text
        </grandchild>
    </child>
    <child>
        Text
    </child>
</parent>

1
ตัวอย่าง XML ของคุณไม่ใช่เอกสาร XML เนื่องจากไม่มีโหนดรูทเดียว ซึ่งอาจเป็นส่วน XML
Robert McKee

0

ฉันใช้วิธีการด้านล่างเพื่อแปลง JSON เป็น XML

List <Item> items;
public void LoadJsonAndReadToXML() {
  using(StreamReader r = new StreamReader(@ "E:\Json\overiddenhotelranks.json")) {
    string json = r.ReadToEnd();
    items = JsonConvert.DeserializeObject <List<Item>> (json);
    ReadToXML();
  }
}

และ

public void ReadToXML() {
  try {
    var xEle = new XElement("Items",
      from item in items select new XElement("Item",
        new XElement("mhid", item.mhid),
        new XElement("hotelName", item.hotelName),
        new XElement("destination", item.destination),
        new XElement("destinationID", item.destinationID),
        new XElement("rank", item.rank),
        new XElement("toDisplayOnFod", item.toDisplayOnFod),
        new XElement("comment", item.comment),
        new XElement("Destinationcode", item.Destinationcode),
        new XElement("LoadDate", item.LoadDate)
      ));

    xEle.Save("E:\\employees.xml");
    Console.WriteLine("Converted to XML");
  } catch (Exception ex) {
    Console.WriteLine(ex.Message);
  }
  Console.ReadLine();
}

ฉันใช้คลาสชื่อ Item เพื่อเป็นตัวแทนองค์ประกอบ

public class Item {
  public int mhid { get; set; }
  public string hotelName { get; set; }
  public string destination { get; set; }
  public int destinationID { get; set; }
  public int rank { get; set; }
  public int toDisplayOnFod { get; set; }
  public string comment { get; set; }
  public string Destinationcode { get; set; }
  public string LoadDate { get; set; }
}

มันได้ผล....


0

สำหรับการแปลงJSONสตริงเพื่อXMLลอง:

    public string JsonToXML(string json)
    {
        XDocument xmlDoc = new XDocument(new XDeclaration("1.0", "utf-8", ""));
        XElement root = new XElement("Root");
        root.Name = "Result";

        var dataTable = JsonConvert.DeserializeObject<DataTable>(json);
        root.Add(
                 from row in dataTable.AsEnumerable()
                 select new XElement("Record",
                                     from column in dataTable.Columns.Cast<DataColumn>()
                                     select new XElement(column.ColumnName, row[column])
                                    )
               );


        xmlDoc.Add(root);
        return xmlDoc.ToString();
    }

สำหรับแปลงXMLที่จะJSONลองนี้

    public string XmlToJson(string xml)
    {
       XmlDocument doc = new XmlDocument();
       doc.LoadXml(xml);

       string jsonText = JsonConvert.SerializeXmlNode(doc);
       return jsonText;
     }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.