ASP.NET中XML转JSON的方法实例

  本文实例讲述了ASP.NET中XML转JSON的方法,分享给大家供大家参考。具体如下:

  一般在许多应用程序中都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理。要实现这一点,它们必须将XML格式转换为JSON格式。

  XML转JSON代码如下:

  

复制代码 代码如下:
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();

  }

  希望本文所述对大家的asp.net程序设计有所帮助。