我有以下xml:
<root xmlns:json='http://james.newtonking.com/projects/json'>
<majorDimension>ROWS</majorDimension>
<range>Sheet6!A1:B2</range>
<values json:Array='true'>
<element json:Array='true'>
<element>Good</element>
<element>Value</element>
</element>
<element json:Array='true'>
<element>Hello</element>
<element>World</element>
</element>
</values>
</root>
我使用以下代码:
var json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None, true);
我得到的输出是这样的
{
"majorDimension": "ROWS",
"range": "Sheet6!A1:B2",
"values": [
{ "element": [ [ "Good", "Value" ],
[ "Hello", "World" ] ]
}
]
}
然而,我想得到一个类似的输出
{
"range": "Sheet6!A1:B2",
"majorDimension": "ROWS",
"values": [
[
"Good",
"Value"
],
[
"Hello",
"World"
]
]
}
如果不了解更多细节,很难提供一个好的解决方案。应该能够反序列化为定义良好的C#类,并从中操作数据。或者类似的。但不管怎样。
第一个选项,注意文档
在同一级别上具有相同名称的多个节点被分组到一个数组中。
https://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htm
因此,您可以将所有element
重命名为values
,并获得嵌套数组输出(比请求多一个(,但它缺少{ "element" : ...
JSON。";元素";内容都在那里。
第二个选项,在转换为JSON之前操作XML文档。这将每个子element
节点提升到树中与values
相同的级别。唯一需要考虑的是,输出数组被称为element
,而不是values
。
using System;
using System.Xml;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
string xmlDoc = @"<root xmlns:json='http://james.newtonking.com/projects/json'>
<majorDimension>ROWS</majorDimension>
<range>Sheet6!A1:B2</range>
<values json:Array='true'>
<element json:Array='true'>
<element>Good</element>
<element>Value</element>
</element>
<element json:Array='true'>
<element>Hello</element>
<element>World</element>
</element>
</values>
</root>";
var xdoc = new XmlDocument();
xdoc.LoadXml(xmlDoc);
var valuesObject = xdoc.GetElementsByTagName("values")[0];
XmlNode parent = valuesObject.ParentNode;
while (valuesObject.ChildNodes.Count > 0)
{
XmlNode child = valuesObject.ChildNodes[0];
parent.InsertBefore(child, valuesObject);
}
parent.RemoveChild(valuesObject);
var json = JsonConvert.SerializeXmlNode(xdoc.ChildNodes[0], Newtonsoft.Json.Formatting.Indented, true);
Console.WriteLine(json);
输出
{
"majorDimension": "ROWS",
"range": "Sheet6!A1:B2",
"element": [
[
"Good",
"Value"
],
[
"Hello",
"World"
]
]
}
第三个选项,将XML转换为JSON,序列化为jobject,操纵结构,反序列化为字符串。
using System;
using System.Xml;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
var xdoc = new XmlDocument();
xdoc.LoadXml(xmlDoc);
var jsonString = JsonConvert.SerializeXmlNode(xdoc.ChildNodes[0], Newtonsoft.Json.Formatting.Indented, true);
var jobj = JObject.Parse(jsonString);
var elements = jobj["values"][0]["element"];
// remove existing "values" node
jobj.Remove("values");
// add a new node called "values" with the contents of the "elements" array
jobj.Add("values", elements);
Console.WriteLine(jobj.ToString());
输出
{
"majorDimension": "ROWS",
"range": "Sheet6!A1:B2",
"values": [
[
"Good",
"Value"
],
[
"Hello",
"World"
]
]
}
替换;Newtonsoft.Json。格式化。无";通过";Newtonsoft.Json.格式化.
var json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.Indented, true);