从json数组内的json数组中删除对象定义,以保持嵌套数组的完整性



我有以下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);

相关内容

  • 没有找到相关文章

最新更新