You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:45:37