如何在C#中将XML转换为无数组名称的JSON?
如何将XML转换为无外层键的纯JSON数组(基于Newtonsoft.Json)
问题背景
现有如下XML文件:
<?xml version="1.0" encoding="UTF-8"?> <root> <UserData> <User_Email>cynthia48@example.com</User_Email> <User_Name>Louis Hebert</User_Name> <User_State>South Dakota</User_State> <id>item1</id> </UserData> <UserData> <User_Email>brian52@example.com</User_Email> <User_Name>David Lewis</User_Name> <User_State>Connecticut</User_State> <id>item2</id> </UserData> </root>
使用以下C#代码转换后:
XmlDocument xmldoc = new XmlDocument(); string xml1 = @"D:\Visual_Codes\Xml_Files\Data.xml"; xmldoc.Load(xml1); xmldoc.RemoveChild(xmldoc.FirstChild); string js = JsonConvert.SerializeXmlNode(xmldoc, Newtonsoft.Json.Formatting.Indented, true);
得到的JSON会包含外层的UserData键:
{ "UserData": [ { "User_Email": "cynthia48@example.com", "User_Name": "Louis Hebert", "User_State": "South Dakota", "id": "item1" }, { "User_Email": "brian52@example.com", "User_Name": "David Lewis", "User_State": "Connecticut", "id": "item2" } ] }
需要将其转换为无外层键的纯JSON数组:
[ { "User_Email": "cynthia48@example.com", "User_Name": "Louis Hebert", "User_State": "South Dakota", "id": "item1" }, { "User_Email": "brian52@example.com", "User_Name": "David Lewis", "User_State": "Connecticut", "id": "item2" } ]
解决方案
方法1:序列化后提取数组节点
先按原方式得到带外层键的JSON,再用Newtonsoft.Json的JObject解析,取出UserData数组后重新序列化:
XmlDocument xmldoc = new XmlDocument(); string xml1 = @"D:\Visual_Codes\Xml_Files\Data.xml"; xmldoc.Load(xml1); xmldoc.RemoveChild(xmldoc.FirstChild); // 先序列化得到带外层的JSON string jsonWithWrapper = JsonConvert.SerializeXmlNode(xmldoc, Newtonsoft.Json.Formatting.Indented, true); // 解析为JObject,提取UserData数组 JObject jsonObj = JObject.Parse(jsonWithWrapper); JArray userDataArray = (JArray)jsonObj["UserData"]; // 序列化数组得到最终结果 string pureArrayJson = userDataArray.ToString(Newtonsoft.Json.Formatting.Indented);
方法2:直接序列化XML节点集合
跳过序列化整个XML文档,直接获取所有UserData节点,将节点集合转换为JSON数组:
XmlDocument xmldoc = new XmlDocument(); string xml1 = @"D:\Visual_Codes\Xml_Files\Data.xml"; xmldoc.Load(xml1); // 获取所有UserData节点 XmlNodeList userNodes = xmldoc.SelectNodes("//UserData"); // 序列化节点集合 string pureArrayJson = JsonConvert.SerializeXmlNode(userNodes, Newtonsoft.Json.Formatting.Indented, true);
这种方法更直接,不需要处理中间的JSON对象,一步到位得到纯数组格式的JSON。
内容的提问来源于stack exchange,提问作者Ayan Ahmed
相关产品推荐
相关产品推荐

