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

Rust中使用serde-xml-rs从struct生成XML如何避免重复标签

Rust serde-xml-rs 嵌套结构体XML标签重复问题解决方案

问题原因

serde-xml-rs 0.5.1版本默认的序列化规则会触发两层标签生成:

  • 序列化A结构体的b字段时,会先生成字段重命名后的<B>标签
  • 序列化B类型的字段值时,会再生成一层和结构体名对应的<B>标签
    两层叠加就出现了重复的B标签。

解决方案

方案1:为嵌套结构体添加#[serde(transparent)]属性

该属性会让serde跳过为B结构体本身生成外层标签,直接序列化内部的字段,适合B结构体仅作为嵌套结构使用、不需要单独生成外层标签的场景:

#[derive(Serialize, Debug)]
struct A {
   #[serde(rename(serialize = "B"))]
   pub b: B
}

// 新增serde(transparent)属性
#[derive(Serialize, Debug)]
#[serde(transparent)]
struct B {
    pub c: String
}

方案2:为上层字段添加#[serde(flatten)]属性

如果B结构体在其他场景需要保留自身的外层标签,可以用该方案,把B结构体的字段直接展开到上层,同时给B结构体配置序列化名称:

#[derive(Serialize, Debug)]
struct A {
   // 替换原来的rename为flatten
   #[serde(flatten)]
   pub b: B
}

// 给B结构体添加rename配置
#[derive(Serialize, Debug)]
#[serde(rename(serialize = "B"))]
struct B {
    pub c: String
}

两种方案修改后,序列化输出都符合预期的单层B标签效果。

内容的提问来源于stack exchange,提问作者chocolate cake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:54:07