C#中JSON转XML时如何为数组元素添加自定义包裹标签
JSON转XML自定义数组节点标签解决方案
你当前转换结果不符合预期,是因为Newtonsoft.Json的DeserializeXmlNode方法默认会将JSON数组的键名直接作为数组元素的XML标签名,你定义的数组键为properties,所以每个数组项都会生成<properties>标签,导致结构不符合目标系统要求,可通过以下两种方案调整:
方案1:预处理JSON结构(最简方案,无需额外转换后处理)
无需修改原有转换逻辑,只需要在调用转换方法前,动态调整JSON中properties数组的结构,将原数组套入一层对象,将数组键名改为property即可。
示例代码如下:
// 先将原始JSON解析为JObject对象 JObject originalJson = JObject.Parse(jsonString); // 提取原properties数组 JArray propArray = (JArray)originalJson["properties"]; // 重构properties节点结构 originalJson["properties"] = new JObject(new JProperty("property", propArray)); // 调用原有转换方法,直接生成符合要求的XML XmlDocument node = JsonConvert.DeserializeXmlNode(originalJson.ToString(), "tag");
方案2:转换完成后修改XML节点结构
如果不希望改动JSON处理逻辑,也可以在得到XML对象后,手动调整节点的名称和层级:
XmlDocument node = JsonConvert.DeserializeXmlNode(jsonString, "tag"); // 查找根节点下所有原properties子节点 XmlNodeList oldPropNodes = node.SelectNodes("/tag/properties"); // 创建新的properties父节点 XmlElement newPropParent = node.CreateElement("properties"); // 遍历所有旧properties节点,重命名为property后移入新父节点 foreach (XmlNode oldNode in oldPropNodes) { XmlElement newPropItem = node.CreateElement("property"); newPropItem.InnerXml = oldNode.InnerXml; newPropParent.AppendChild(newPropItem); // 删除原节点 oldNode.ParentNode.RemoveChild(oldNode); } // 将重构完成的properties父节点加入根节点 node.DocumentElement.AppendChild(newPropParent);
注意事项
你贴出的转换结果中存在<externalGuid>的闭合标签错误写为</comosUID>的问题,如果是实际转换结果存在该错误,需要先检查输入JSON的键名是否匹配。
内容的提问来源于stack exchange,提问作者PalBo
相关产品推荐
相关产品推荐

