Serialization 如何仅序列化变量的名称并忽略结构(serde)中枚举字段的值

Serialization 如何仅序列化变量的名称并忽略结构(serde)中枚举字段的值,serialization,struct,rust,enums,serde,Serialization,Struct,Rust,Enums,Serde,根据定义: #[派生(序列化、反序列化)] 枚举条{ A(i64), B(u64), } #[派生(序列化、反序列化)] 结构Foo{ 酒吧:酒吧,, } 的JSON序列化 Foo{ 巴:巴::A(123), } 将是: { “酒吧”:“A” } 最好在结构中的字段中添加属性,而不是在枚举定义中添加属性(枚举将在需要序列化值的结构字段中重用)该属性可用于元组变量字段: use serde::{Serialize, Deserialize}; // 1.0.126 use serde_jso

根据定义:

#[派生(序列化、反序列化)]
枚举条{
A(i64),
B(u64),
}
#[派生(序列化、反序列化)]
结构Foo{
酒吧:酒吧,,
}
的JSON序列化

Foo{
巴:巴::A(123),
}
将是:

{
“酒吧”:“A”
}
最好在结构中的字段中添加属性,而不是在枚举定义中添加属性(枚举将在需要序列化值的结构字段中重用)

该属性可用于元组变量字段:

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”}
如果不选择修改
条形图
,则必须通过或手动执行更多操作:


“你认为值得为这个做另一个枚举还是用手工的方式?”JawadAhmed对你说。如果您只在其他地方按名称使用另一个枚举,那么它可能是值得的,但是像这样的一个孤立案例我不会担心。我将坚持后一种方法,这将使事情总体上不那么复杂,谢谢:)
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());
}