如何使用Serde(de)从JSON命名值而不是数组序列化元组结构?

时间:2017-02-05 10:58:11

标签: json serialization rust serde

我有一个JSON对象:

{ "min": 2, "max": 15 }

我想将它解析为这个元组结构:

#[derive(Serialize, Deserialize, Debug)]
struct TeamSize(pub i64, pub i64);
#[derive(Serialize, Deserialize, Debug)]
struct Match {
    size: TeamSize,
}

当前的Serde序列化机制似乎没有提供(de)从命名值而不是数组序列化元组结构的功能。

生成的(反)序列化机制需要以下内容:

{"size": [2, 15]}

我尝试过使用Serde属性,但是找不到符合我想要的属性:

#[derive(Serialize, Deserialize, Debug)]
pub struct TeamSize(
    #[serde(rename = "min")]
    pub i64,
    #[serde(rename = "max")]
    pub i64
);

如何解析它?我应该自己实施一切吗?

我打开了issue on the Serde repository

1 个答案:

答案 0 :(得分:3)

#[derive(Serialize, Deserialize, Debug)]
pub struct TeamSize(
    #[serde(rename = "min")]
    pub i64,
    #[serde(rename = "max")]
    pub i64
);

不是有效代码,Serde rename属性只重命名正在序列化和反序列化的内容,它不会更改您的代码。在元组结构(您的第一个)中,您可以(并且必须)省略名称,因为您只需通过self.0和self.1访问它们,但结构没有first或{{1 }}字段,因此您必须为它们添加名称。

像这样:

second

由于您的属性名称是JSON属性的名称(#[derive(Serialize, Deserialize, Debug)] pub struct TeamSize { pub max: i64, pub min: i64, }; min),因此您无需使用max。如果您的Rust结构使用字段serde(rename)value_max但您的JSON仍然使用value_minmax,那么您将需要它。

如果您绝对想要将其解析为元组结构,则必须自己为自定义结构实现minSerialize。我认为这不值得麻烦,只需切换到结构而不是元组结构。