8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何仅序列化变体的名称并忽略结构中的枚举字段的值

user17732522 1月前

33 0

给定定义:#[derive(Serialize, Deserialize)]enum Bar { A(i64), B(u64),}#[derive(Serialize, Deserialize)]struct Foo { bar: Bar,}Foo 的 JSON 序列化 { bar: Bar:...

给出定义:

#[derive(Serialize, Deserialize)]
enum Bar {
  A(i64),
  B(u64),
}

#[derive(Serialize, Deserialize)]
struct Foo {
  bar: Bar,
}

JSON 序列化为

Foo {
  bar: Bar::A(123),
}

将是:

{
  "bar": "A"
}

理想的做法是将属性添加到结构中的字段中,而不是在枚举定义中(枚举将在结构字段中重用,其中值也需要序列化)

帖子版权声明 1、本帖标题:如何仅序列化变体的名称并忽略结构中的枚举字段的值
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由user17732522在本站《parsing》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @JawadAhmed 由你决定。如果你在其他地方仅按名称使用它,另一个枚举可能是值得的,但像这样的孤立情况我不会担心。

  • 属性 #[serde(skip)] 可用于元组变体字段:

    use serde::{Serialize, Deserialize}; // 1.0.126
    use serde_json; // 1.0.64
    
    #[derive(Serialize, Deserialize)]
    enum Bar {
        A(#[serde(skip)] i64),
        B(#[serde(skip)] u64),
    }
    
    #[derive(Serialize, Deserialize)]
    struct Foo {
        bar: Bar,
    }
    
    fn main() {
        let foo = Foo { bar: Bar::A(123) };
        println!("{}", serde_json::to_string(&foo).unwrap());
    }
    
    {"bar":"A"}
    

    如果 Bar 无法修改,则必须通过 #[serde(with = ...)] or #[serde(serialize_with = ...)] :

    use serde::{Serialize, Deserialize, ser::Serializer}; // 1.0.126
    use serde_json; // 1.0.64
    
    #[derive(Serialize, Deserialize)]
    enum Bar {
        A(i64),
        B(u64),
    }
    
    #[derive(Serialize, Deserialize)]
    struct Foo {
        #[serde(serialize_with = "bar_name_only")]
        bar: Bar,
    }
    
    fn bar_name_only<S>(bar: &Bar, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let name = match bar {
            Bar::A(_) => "A",
            Bar::B(_) => "B",
        };
    
        serializer.serialize_str(name)
    }
    
    fn main() {
        let foo = Foo { bar: Bar::A(123) };
        println!("{}", serde_json::to_string(&foo).unwrap());
    }
    
    {"bar":"A"}
    
返回
作者最近主题: