C# :XML和JSON互转


我们一般在用JSON或者XML作为数据交换的时候,可能定义一个没有真正意义方法的类,其实就是一个关于属性的数据结构,如果对于这种情况,可以将这个类对象作为中介,然后利用C#提供的序列化和反序列化的方法。今天看到一个别人封装好的感觉不错,就转载:
private
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 childNodeNames = new SortedList(); // 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) { ArrayList alChild = (ArrayList)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 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 object oValuesAL = childNodeNames[nodeName]; ArrayList ValuesAL; if (oValuesAL == null) { ValuesAL = new ArrayList(); childNodeNames[nodeName] = ValuesAL; } else ValuesAL = (ArrayList)oValuesAL; 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(); }

 

 

/// <summary>

        /// json字符串转换为Xml对象

        /// </summary>

        /// <param name="sJson"></param>

        /// <returns></returns>

        public static XmlDocument Json2Xml(string sJson)

        {

            //XmlDictionaryReader reader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(sJson), XmlDictionaryReaderQuotas.Max);

            //XmlDocument doc = new XmlDocument();

            //doc.Load(reader);



            JavaScriptSerializer oSerializer = new JavaScriptSerializer();

            Dictionary<string, object> Dic = (Dictionary<string, object>)oSerializer.DeserializeObject(sJson);

            XmlDocument doc = new XmlDocument();

            XmlDeclaration xmlDec;

            xmlDec = doc.CreateXmlDeclaration("1.0", "gb2312", "yes");

            doc.InsertBefore(xmlDec, doc.DocumentElement);

            XmlElement nRoot = doc.CreateElement("root");

            doc.AppendChild(nRoot);

            foreach (KeyValuePair<string, object> item in Dic)

            {

                XmlElement element = doc.CreateElement(item.Key);

                KeyValue2Xml(element, item);

                nRoot.AppendChild(element);

            }

            return doc;

        }



        private static void KeyValue2Xml(XmlElement node, KeyValuePair<string, object> Source)

        {

            object kValue = Source.Value;

            if (kValue.GetType() == typeof(Dictionary<string, object>))

            {

                foreach (KeyValuePair<string, object> item in kValue as Dictionary<string, object>)

                {

                    XmlElement element = node.OwnerDocument.CreateElement(item.Key);

                    KeyValue2Xml(element, item);

                    node.AppendChild(element);

                }

            }

            else if (kValue.GetType() == typeof(object[]))

            {

                object[] o = kValue as object[];

                for (int i = 0; i < o.Length; i++)

                {

                    XmlElement xitem = node.OwnerDocument.CreateElement("Item");

                    KeyValuePair<string, object> item = new KeyValuePair<string, object>("Item", o[i]);

                    KeyValue2Xml(xitem, item);

                    node.AppendChild(xitem);

                }

                   

            }

            else

            {

                XmlText text = node.OwnerDocument.CreateTextNode(kValue.ToString());

                node.AppendChild(text);

            }

        }



 

 

参考:http://blog.csdn.net/bancxc/article/details/5450329

http://www.cnblogs.com/yiranleguan/archive/2012/01/11/2318727.html

你可能感兴趣的:(json)