2

我有一个 JSON 对象:

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

我想把它解析成这个元组结构:

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

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

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

{"size": [2, 15]}

我尝试使用 Serde 属性,但找不到可以满足我要求的属性:

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

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

在 Serde 存储库上打开了一个问题

4

1 回答 1

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

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

像这样:

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

由于您的属性名称是 JSON 属性的名称(minmax),因此您不需要使用serde(rename). value_max如果你的 Rust 结构使用了字段,value_min但你的 JSON 仍然使用maxand ,你会需要它min

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

于 2017-02-05T11:19:46.513 回答