我有以下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"
]
]
}发布于 2022-09-23 17:58:25
如果不知道更多的细节,就很难提供一个好的解决方案。应该能够反序列化为一个定义良好的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,操作结构,反序列化为string。
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"
]
]
}发布于 2022-09-23 16:18:06
将"Newtonsoft.Json.Formatting.None“替换为”Newtonsoft.Json.Formatting“。
var json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.Indented, true);https://stackoverflow.com/questions/73830137
复制相似问题