Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个元素的数组上循环时,使用newtonsoft问题将xml转换为json_C#_Xml_Linq_Json.net - Fatal编程技术网

C# 在一个元素的数组上循环时,使用newtonsoft问题将xml转换为json

C# 在一个元素的数组上循环时,使用newtonsoft问题将xml转换为json,c#,xml,linq,json.net,C#,Xml,Linq,Json.net,只有在源xml中只有一个元素的集合时,才会出现错误, 在第一个元素的示例中,我正确地获得了子元素(item),但在第二个元素中只有一个子元素,因此代码抛出异常(无法访问Newtonsoft.Json.Linq.JProperty上的子值) 谢谢 JObject firstLevels = new JObject(); string sourceXML = "<Root> <FirstLevel id=\"1\" name=\"1\

只有在源xml中只有一个元素的集合时,才会出现错误, 在第一个元素的示例中,我正确地获得了子元素(item),但在第二个元素中只有一个子元素,因此代码抛出异常(无法访问Newtonsoft.Json.Linq.JProperty上的子值)

谢谢

JObject firstLevels = new JObject();
string sourceXML = "<Root>
                        <FirstLevel id=\"1\" name=\"1\">
                            <Item id=\"1\" name=\"1.1\" />
                                <Item id=\"2\" name=\"1.2\" />
                        </FirstLevel>
                        <FirstLevel id=\"2\" name=\"2\">
                            <Item id=\"1\" name=\"2.1\" />
                        </FirstLevel>
                    </Root>";

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(sourceXML);
XmlNodeList nodeList;
nodeList = xmlDoc.SelectNodes("Root/FirstLevel");
JArray jarray = new JArray();

foreach (XmlNode node in nodeList)
{
    string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(node);
    jarray.Add(JObject.Parse(json));
}

firstLevels["result"] = jarray;

foreach(var first in firstLevels["result"].Children<JObject>())
{
    Console.WriteLine(first["FirstLevel"]["@name"].Value<string>());

    foreach (var item in first["FirstLevel"]["Item"])
        Console.WriteLine(" -- " + item["@name"].Value<string>());
}
JObject firstLevels=new JObject();
字符串sourceXML=”
";
XmlDocument xmlDoc=新的XmlDocument();
LoadXml(sourceXML);
XmlNodeList节点列表;
nodeList=xmlDoc.SelectNodes(“根/第一级”);
JArray JArray=新的JArray();
foreach(节点列表中的XmlNode节点)
{
字符串json=Newtonsoft.json.JsonConvert.SerializeXmlNode(节点);
Add(JObject.Parse(json));
}
第一级[“结果”]=jarray;
foreach(第一级[“结果”].Children()中的第一个变量)
{
Console.WriteLine(first[“FirstLevel”][“@name”].Value());
foreach(第一个[“第一级”][“项目”]中的var项目)
Console.WriteLine(“--”+项[“@name”].Value());
}

您不需要手动进行xml到json的转换

string sourceXML = "<Root><FirstLevel id=\"1\" name=\"1\"><Item id=\"1\" name=\"1.1\" /><Item id=\"2\" name=\"1.2\" /></FirstLevel><FirstLevel id=\"2\" name=\"2\"><Item id=\"1\" name=\"2.1\" /></FirstLevel></Root>";

var json = JsonConvert.SerializeObject(XDocument.Parse(sourceXML));
所以你要这么做:

string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(node);
对于这两个节点:

<FirstLevel id=\"1\" name=\"1\">
    <Item id=\"1\" name=\"1.1\" />
        <Item id=\"2\" name=\"1.2\" />
</FirstLevel>

<FirstLevel id=\"2\" name=\"2\">
    <Item id=\"1\" name=\"2.1\" />
</FirstLevel>
详情如下:


放入虚拟节点以强制JSON.NET序列化为数组

我真的不喜欢这样,但是如果您不能调整XML,那么将代码更改为类似的内容可以实现以下目的:

foreach (XmlNode node in nodeList)
{        
    string json;
    if (node.SelectNodes("Item").Count == 1)
    {
        // Append a dummy node and then strip it out - horrible!
        node.AppendChild(xmlDoc.CreateNode("element", "Item", ""));
        json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(node).Replace(",null]", "]");
    }
    else
    {
        json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(node);                    
    }

    jarray.Add(JObject.Parse(json));
}

阅读时检查

当然,您可以在处理数据时检查类型,如下所示:

foreach (var first in firstLevels["result"].Children<JObject>())
{
    Console.WriteLine(first["FirstLevel"]["@name"].Value<string>());

    if (first["FirstLevel"]["Item"] is Newtonsoft.Json.Linq.JObject)
    {
        Console.WriteLine(" -- " + first["FirstLevel"]["Item"]["@name"].Value<string>());
    }
    else
    {
        foreach (var item in first["FirstLevel"]["Item"])
            Console.WriteLine(" -- " + item["@name"].Value<string>());
    }
}
foreach(firstLevels[“result”].Children()中的第一个变量)
{
Console.WriteLine(first[“FirstLevel”][“@name”].Value());
if(first[“FirstLevel”][“Item”]是Newtonsoft.Json.Linq.JObject)
{
Console.WriteLine(“--”+first[“FirstLevel”][“Item”][“@name”].Value());
}
其他的
{
foreach(第一个[“第一级”][“项目”]中的var项目)
Console.WriteLine(“--”+项[“@name”].Value());
}
}

您可以使用助手方法来处理这种情况。看看我的答案。
foreach (XmlNode node in nodeList)
{        
    string json;
    if (node.SelectNodes("Item").Count == 1)
    {
        // Append a dummy node and then strip it out - horrible!
        node.AppendChild(xmlDoc.CreateNode("element", "Item", ""));
        json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(node).Replace(",null]", "]");
    }
    else
    {
        json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(node);                    
    }

    jarray.Add(JObject.Parse(json));
}
foreach (var first in firstLevels["result"].Children<JObject>())
{
    Console.WriteLine(first["FirstLevel"]["@name"].Value<string>());

    if (first["FirstLevel"]["Item"] is Newtonsoft.Json.Linq.JObject)
    {
        Console.WriteLine(" -- " + first["FirstLevel"]["Item"]["@name"].Value<string>());
    }
    else
    {
        foreach (var item in first["FirstLevel"]["Item"])
            Console.WriteLine(" -- " + item["@name"].Value<string>());
    }
}