XML转JSON动态对象后,如何处理含特殊字符的字段?
处理XML转JSON时XML声明变为"?xml"键的问题
这个情况其实是Newtonsoft.Json处理XmlDocument的默认行为导致的——XmlDocument会把XML声明(<?xml version="1.0" encoding="utf-8"?>)当作一个XmlDeclaration节点,序列化时就会被转成"?xml"这个键值对。下面给你几个实用的解决方法:
方法1:加载XML后移除声明节点
直接在序列化前从XmlDocument中移除XML声明节点,这样序列化后的JSON就不会包含这个键了:
XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); // 检查并移除XML声明节点 if (doc.FirstChild is XmlDeclaration xmlDeclaration) { doc.RemoveChild(xmlDeclaration); } string jsonText = JsonConvert.SerializeXmlNode(doc); dynamic obj = JsonConvert.DeserializeObject<object>(jsonText);
方法2:序列化时忽略XML声明
通过配置XmlNodeConverter的参数,让序列化过程自动跳过XML声明,这种方式不需要修改原XML文档:
XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); // 配置转换器,忽略XML声明 var xmlConverter = new XmlNodeConverter { OmitXmlDeclaration = true }; string jsonText = JsonConvert.SerializeObject(doc, xmlConverter); dynamic obj = JsonConvert.DeserializeObject<object>(jsonText);
方法3:从已生成的JSON对象中移除该键
如果已经完成了序列化,只想清理最终的dynamic对象,可以先转成JObject再移除"?xml"属性:
XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); string jsonText = JsonConvert.SerializeXmlNode(doc); // 转成JObject移除不需要的键 JObject jsonObj = JsonConvert.DeserializeObject<JObject>(jsonText); jsonObj.Remove("?xml"); dynamic obj = jsonObj;
根据你的实际场景选就行,前两种方法是从源头避免生成这个键,第三种是事后清理,都能解决问题。
内容的提问来源于stack exchange,提问作者silent
相关产品推荐
相关产品推荐

