Convert XML to JSON string.

Have you ever think how to convert XML data to JSON string, the next is JSON string to objects, and you can easily navigate to the XML data by access to object’s properties.

The following code show you a way to convert XML data to JSON string:

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();
       }

And after this, you can use JSON.NET (http://www.codeplex.com/Json) or JavaScriptSerializer (System.Web.Script.Serialization of System.Web.Extension dll (.NET 3.5) to de-serialize  to objects


JSON.NET



XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\owssvr.xml");
            string jsonString = XmlToJSON(doc);
            Newtonsoft.Json.Linq.JObject jSonObject =
(Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(jsonString);




 
JavascriptSerializer


JavaScriptSerializer jss = new JavaScriptSerializer();
            object jSonObject = jss.DeserializeObject(jsonString);

Comments

Popular posts from this blog

Setup SharePoint 2010

Register CSS to SP Master Page