使用JsonConvert转换XML为JSON时键名含@/#符号,如何去除?
解决Newtonsoft XML转JSON时键名带#或@的问题
这个问题挺常见的,Newtonsoft默认用@前缀标记XML元素的属性,用#text标记元素的文本内容,目的是区分XML里不同类型的节点。要去掉这些符号,只需要通过XmlNodeConverter的配置就能实现,具体步骤如下:
1. 理解符号的来源
@前缀:对应XML元素的属性,比如<book id="123">里的id属性,默认会被序列化为"@id": "123"#text:对应XML元素的文本内容,当元素同时包含属性和文本时(比如<title lang="en">Hello</title>),文本会被放在"#text": "Hello"这个键下
2. 具体解决代码
首先确保你已经引用了Newtonsoft.Json和Newtonsoft.Json.Converters命名空间,然后通过配置XmlNodeConverter来移除这些符号:
using Newtonsoft.Json; using Newtonsoft.Json.Converters; // 配置XmlNodeConverter,去掉@和#前缀 var xmlConverter = new XmlNodeConverter { AttributeNamePrefix = "", // 移除属性的@前缀,直接用属性名作为键 TextNodeName = "text", // 将文本节点的键名从#text改为"text",去掉#符号 OmitRootObject = true // 可选:如果不需要保留XML的根节点,开启这个选项 }; // 执行序列化 string jsonText = JsonConvert.SerializeXmlNode(myNode, Formatting.Indented, xmlConverter);
3. 效果对比
假设你的XML是这样的:
<book id="123"> <title lang="en">Newtonsoft Guide</title> <author>John Doe</author> </book>
- 默认序列化结果(带@和#):
{ "book": { "@id": "123", "title": { "@lang": "en", "#text": "Newtonsoft Guide" }, "author": "John Doe" } }
- 配置后的序列化结果:
{ "id": "123", "title": { "lang": "en", "text": "Newtonsoft Guide" }, "author": "John Doe" }
额外说明
- 如果希望文本节点直接作为元素的默认值(而不是单独的键),这种情况只在元素只有文本内容、没有属性和其他子节点时会自动实现(比如上面的
author元素),如果元素有属性+文本,只能通过修改TextNodeName来替换#符号,避免键名带特殊字符。 - 不要随意把
TextNodeName设为空字符串,可能会导致键名冲突,建议用text或value这类有意义的名称。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

