C# 在一个元素的数组上循环时,使用newtonsoft问题将xml转换为json
只有在源xml中只有一个元素的集合时,才会出现错误, 在第一个元素的示例中,我正确地获得了子元素(item),但在第二个元素中只有一个子元素,因此代码抛出异常(无法访问Newtonsoft.Json.Linq.JProperty上的子值) 谢谢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\
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>());
}
}