go标准库可可靠完成xml与json双向转换,关键在于结构体字段正确声明xml和json标签,注意大小写、嵌套层级、属性映射及cdata等细节。

用 encoding/xml 和 encoding/json 原生互转就行,别急着找第三方库
Go 标准库已经能可靠完成 XML 与 JSON 的双向转换,前提是结构体字段标签写对。很多项目引入 xml2json 或 goxml2json 等第三方库,结果反而踩坑:比如忽略命名空间、丢失 CDATA、或把空元素转成 null 而不是 {}。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 先用
xml.Unmarshal解析 XML 到结构体,再用json.Marshal转出 JSON —— 这是最可控的路径 - 结构体字段必须同时声明
xml和json标签,例如:XMLName xml.Name `xml:"root" json:"-"`(json:"-"是为了跳过根名) - 如果 XML 有混合内容(text + child elements),标准库不支持直接映射,得手动处理
xml.CharData字段
xml.Unmarshal 后字段为空?检查标签大小写和嵌套层级
常见错误是 XML 小写字段(如 <user_id>123</user_id>)对应结构体用了大写字段名 UserID,但没加 xml:"user_id" 标签,导致解析失败且静默丢弃。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- XML 元素名严格区分大小写,
xml:"UserId"和xml:"user_id"完全不同 - 嵌套结构必须逐层定义结构体,不能靠“扁平化”偷懒;例如
<data><item><name>A</name></item></data>需要Data struct{ Items []Item `xml:"item"` } - 用
xml:",any"可捕获未知子元素,但会失去类型安全,慎用
JSON 转回 XML 时属性(attribute)消失?因为标准库不自动映射 attr
encoding/xml 支持属性,但必须显式声明 xml:",attr",否则字段会被当子元素处理。比如 <user id="123"></user> 中的 id,若结构体字段只写 ID string `json:"id"`,转 XML 时它会变成 <id>123</id>,而非属性。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 需要输出属性的字段,必须同时带
xml:",attr"和json标签,例如:ID string `xml:"id,attr" json:"id"` - XML 属性值不能是结构体或切片,只能是字符串、数字、布尔等基础类型
- 注意:JSON 没有“属性”概念,所以从 JSON → XML 时,所有
xml:",attr"字段必须在 JSON 中存在且可解码,否则生成 XML 时该属性被跳过
性能敏感场景下,避免重复序列化/反序列化
频繁做 XML ↔ JSON 转换时,每轮都走 Unmarshal + Marshal 开销不小,尤其 XML 较大。这不是 GC 问题,而是反射+字符串拼接的累积成本。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 如果只是临时查看或调试,用
xmlquery或gokogiri直接查 XPath 提取字段,绕过结构体绑定 - 若需高频双向转换,可缓存结构体实例,或预编译
xml.Encoder/Decoder实例复用 - 别用
json.RawMessage存 XML 字符串再“假装”已转——后续一旦要改字段,类型安全就没了
真正麻烦的从来不是“怎么转”,而是 XML 里那些没文档的隐式规则:默认命名空间、、自闭合标签是否等价于空元素、注释是否保留……这些标准库不会替你猜,得看原始 XML 样本定策略。










