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

标签 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 序列化机制似乎不提供从命名值而不是数组序列化(反)序列化元组结构的功能。

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

{"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 .

最佳答案

#[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。不过,我认为这不值得麻烦,只需切换到结构而不是元组结构即可。

关于json - 如何使用 Serde 从 JSON 命名值而不是数组中(反)序列化元组结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42051216/

相关文章:

serialization - 使用私有(private)构造函数的 Boost 序列化适用于 1.57,不适用于 1.58

rust - 不能在 Rc 中借用为可变的

rust - 创建默认函数参数

javascript - 如何从 javascript 读取包含数组的 json 文件

c# - 如何在 ASP.NET Web API C# 中返回 JSON 数组

python - Django休息框架: Serializing a model and grouping by a foreign key for other data

rust - 网络服务器仅从 http ://localhost:8000 启动

javascript - 回调函数似乎没有执行

ruby-on-rails - 向 api 发出 POST 请求时缺少参数或值为空

php - 全局 $wpdb 显示垃圾数据以及我的选择查询的结果