XML转JSON时如何移除嵌套数组中的对象定义,保留数组结构?
XML转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>
使用Newtonsoft.Json的代码序列化:
var json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None, true);
得到的JSON包含多余的嵌套对象:
{ "majorDimension": "ROWS", "range": "Sheet6!A1:B2", "values": [ { "element": [ [ "Good", "Value" ], [ "Hello", "World" ] ] } ] }
期望输出的JSON需要去掉values中的嵌套对象,保留纯净二维数组:
{ "range": "Sheet6!A1:B2", "majorDimension": "ROWS", "values": [ [ "Good", "Value" ], [ "Hello", "World" ] ] }
解决方案
方案1:调整XML结构(推荐)
问题根源在于XML中values节点的数组标记方式,以及内层element的嵌套逻辑。修改XML,用json:Array标记内层的数组节点,而非给element加标记:
<root xmlns:json='http://james.newtonking.com/projects/json'> <majorDimension>ROWS</majorDimension> <range>Sheet6!A1:B2</range> <values json:Array='true'> <json:Array> <element>Good</element> <element>Value</element> </json:Array> <json:Array> <element>Hello</element> <element>World</element> </json:Array> </values> </root>
重新序列化后,就能直接得到期望的二维数组结构。
方案2:序列化后修正JSON结构
如果无法修改原始XML,可在序列化后通过JObject调整结构:
// 序列化得到原始JSON var rawJson = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.Indented, true); var jsonObj = JObject.Parse(rawJson); // 提取嵌套的element数组,替换原values节点 jsonObj["values"] = jsonObj["values"][0]["element"]; // 生成最终JSON var finalJson = jsonObj.ToString(Newtonsoft.Json.Formatting.Indented);
这段代码会把values里的嵌套数组提取出来,替换掉多余的对象包装,得到目标格式。
方案3:自定义序列化转换器
如果需要处理大量类似XML,可以自定义XmlNodeConverter,重写节点转换逻辑,让values下的element直接转为数组元素。这种方式适合通用场景,但实现相对复杂。
内容的提问来源于stack exchange,提问作者Saurav
相关产品推荐
相关产品推荐

