您的位置:首页 > 编程语言 > ASP

ASP.NET中XML转JSON的方法

2014-10-21 23:39 489 查看
原文:ASP.NET中XML转JSON的方法许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理。要实现这一点,它们必须将XML格式转换为JSON格式。

XML转JSON代码

[csharp] view plaincopy





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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: