serialization - 如何在不包含枚举变体名称的情况下序列化枚举?

标签 serialization rust serde serde-json

我正在尝试将枚举序列化为 JSON 字符串。我按照文档中的描述为我的枚举实现了 Serialize 特性,但我总是得到 {"offset":{"Int":0}} 而不是所需的{“偏移量”:0}

extern crate serde;
extern crate serde_json;

use std::collections::HashMap;

use serde::ser::{Serialize, Serializer};

#[derive(Debug)]
enum TValue<'a> {
    String(&'a str),
    Int(&'a i32),
}

impl<'a> Serialize for TValue<'a> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        match *self {
            TValue::String(ref s) => serializer.serialize_newtype_variant("TValue", 0, "String", s),
            TValue::Int(i) => serializer.serialize_newtype_variant("TValue", 1, "Int", &i),
        }
    }
}

fn main() {
    let offset: i32 = 0;
    let mut request_body = HashMap::new();
    request_body.insert("offset", TValue::Int(&offset));
    let serialized = serde_json::to_string(&request_body).unwrap();
    println!("{}", serialized); // {"offset":{"Int":0}}
}

最佳答案

您可以使用 untagged将产生所需输出的属性。您不需要自己实现 Serialize:

#[derive(Debug, Serialize)]
#[serde(untagged)]
enum TValue<'a> {
    String(&'a str),
    Int(&'a i32),
}

如果你想自己实现Serialize,我相信你想跳过你的变体,所以你不应该使用serialize_newtype_variant(),因为它会暴露你的变体。您应该直接使用 serialize_str()serialize_i32():

impl<'a> Serialize for TValue<'a> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        match *self {
            TValue::String(s) => serializer.serialize_str(s),
            TValue::Int(i) => serializer.serialize_i32(*i),
        }
    }
}

它产生所需的输出:

{"offset":0}

关于serialization - 如何在不包含枚举变体名称的情况下序列化枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52034764/

相关文章:

json - 为什么 serde_json::from_reader 取得读者的所有权?

json - 使用Serde反序列化嵌套JSON结构时的“invalid type: map, expected a sequence”

django-rest-framework - Django REST Framework ValidationError 总是返回 400

java - 序列化/反序列化 ClassCastException : x cannot be cast to java. io.ObjectStreamClass

rust - Arc、thread 和 channel 的借用值不够长

formatting - 如何将带符号的整数格式化为带符号的十六进制表示形式?

java - 在 JSON 序列化中,如果 Class1 是 Class2 的字段,如何忽略某些 Class1 字段?

java - java中的字节数组在从对象转换后返回null

rust - 试图从循环外部借用变量绑定(bind)

rust - 如何使用 Serde 在序列化期间转换字段?