如何在不包含枚举变体名称的情况下序列化枚举?
How do I serialize an enum without including the name of the enum variant?
我正在尝试将枚举序列化为 JSON 字符串。我按照文档中的描述为我的枚举实现了 Serialize
特性,但我总是得到 {"offset":{"Int":0}}
而不是所需的 {"offset":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}
我正在尝试将枚举序列化为 JSON 字符串。我按照文档中的描述为我的枚举实现了 Serialize
特性,但我总是得到 {"offset":{"Int":0}}
而不是所需的 {"offset":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}