将XML转换为JSon

时间:2014-01-05 11:47:23

标签: c# json

下面是将Xml转换为JSon的函数,问题是如果你有xml属性值为“001”,它将返回为“1”。但是在textview的小提琴手中,我得到了正确的价值,而JSon却没有。

有什么问题?

public string StringXmltoJSon(string xmlDoc)
{
    XmlDocument I_xDoc = new XmlDocument();
    //string strInputXml = GetDataFromStream(xmlDoc);
    I_xDoc.LoadXml(xmlDoc);
    StringBuilder sbJSON = new StringBuilder();
    sbJSON.Append("{ ");
    XmlToJSONnode(sbJSON, I_xDoc.DocumentElement, true);
    sbJSON.Append("}");
    return MSOutJson(sbJSON.ToString());
}

private static Stream MSOutJson(string strjson)
{
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
    return new MemoryStream(System.Text.Encoding.UTF8.GetBytes(strjson));
}

//  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)
{
    int number;
    if (alChild != null && int.TryParse(alChild.ToString(), out number))
    {
        alChild = alChild.ToString();
        if (alChild is string)
        {
            if (showNodeName)
                sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
            string sChild = (string)alChild;
            sChild = sChild.Trim();
            sbJSON.Append(SafeJSON(sChild));
        }
        sbJSON.Append(", ");
    }

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

1 个答案:

答案 0 :(得分:0)

首先安装NuGetPM> Install-Package Newtonsoft.Json
确保您还在文件顶部添加对包的引用

将您的StringXmltoJSon更新为

public string StringXmltoJSon(string xmlDoc)
{
     XmlDocument I_xDoc = new XmlDocument();
     I_xDoc.LoadXml(xmlDoc);
     string jsonText = JsonConvert.SerializeXmlNode(I_xDoc);
     return jsonText;
}