首页 > 编程 > .NET > 正文

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

2024-07-10 13:28:16
字体:
来源:转载
供稿:网友
这篇文章主要介绍了ASP.NET中XML转JSON的方法,实例讲述了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程序设计有所帮助。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表