Как мне сериализовать перечисление, не включая имя варианта перечисления? - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь сериализовать перечисление в строку 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}}
}

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете использовать атрибут 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}
...