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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:38:03