如何使用Serde将元组结构体从JSON序列化或反序列化为命名值而不是数组?

3
我有一个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存储库上开了个问题
1个回答

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

不是有效的代码,Serde的rename属性只会重命名被序列化和反序列化的内容,它不会改变你的代码。在一个元组结构体(你的第一个)中,你可以(并且必须)省略名称,因为你可以通过self.0和self.1来访问它们,但是一个结构体没有firstsecond字段,所以你必须给它们添加一个名称。

像这样:

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

由于您的属性名称与JSON属性名称相同(都是minmax),因此您不需要使用serde(rename)。只有当您的Rust结构体使用字段value_maxvalue_min,但是您的JSON仍然使用maxmin时,才需要使用它。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接