XML转JSON时如何阻止JsonConvert.SerializeXmlNode自动添加转义字符?
问题描述
现有XML消息:
<Data> <aa>12345 67890</aa> <bb>98765\4321</bb> </Data>
使用以下C#代码转换为JSON:
String strXmlData = xmlHelper.SelectSingleNode(xml,"//Data").OuterXML; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(strXmlData); String jsonData = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None);
转换后JSON自动添加了转义字符:
{"aa":"12345\n67890","bb":"98765\\4321"}
需要保留原值(即让\n显示为实际换行,\显示为单个反斜杠,而非转义后的字符串形式),询问是否有方法阻止JsonConvert生成转义字符,或移除转义字符的可行方案。
解决方案
首先明确:标准JSON语法要求字符串中的控制字符(如换行)和反斜杠必须转义,转义后的\n在反序列化时会自动还原为实际换行,\\会还原为单个反斜杠。如果下游系统能正常解析,建议保留默认行为,这是最安全的做法。
如果确实需要输出非标准JSON或调整转义规则,可参考以下方法:
方法一:修改序列化配置,控制转义行为
通过JsonSerializerSettings调整转义规则,让控制字符(如换行)不被转义:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(strXmlData); var settings = new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }; String jsonData = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None, settings);
该配置仅转义非ASCII字符,保留原始换行符。但反斜杠仍会被转义为\\——这是JSON语法强制要求,不转义会导致JSON无效。
方法二:手动替换转义字符(不推荐)
若确定无需遵循标准JSON语法,可在序列化后手动替换转义字符:
String jsonData = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None); // 将转义的\n替换为实际换行 jsonData = jsonData.Replace("\\n", Environment.NewLine); // 将转义的\\替换为单个\ jsonData = jsonData.Replace("\\\\", "\\");
⚠️ 注意:这种方法可能破坏JSON结构或导致数据失真,比如原始值中若包含\\n(即反斜杠加n),替换后会变成实际换行,仅在能确保原始数据无此类特殊组合时使用。
内容的提问来源于stack exchange,提问作者dmd
相关产品推荐
相关产品推荐

