如何使用 Serde 从 JSON 命名值而不是数组中(反)序列化元组结构?
How to use Serde to (de)serialize a tuple struct from JSON named values instead of an array?
我有一个 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
);
如何解析?我应该自己实现一切吗?
#[derive(Serialize, Deserialize, Debug)]
pub struct TeamSize(
#[serde(rename = "min")]
pub i64,
#[serde(rename = "max")]
pub i64
);
不是有效代码,Serde rename
属性仅重命名正在序列化和反序列化的内容,它不会更改您的代码。在元组结构(您的第一个)中,您可以(并且必须)省略名称,因为您只需通过 self.0 和 self.1 访问它们,但是结构没有 first
或 second
字段,因此您必须为它们添加一个名称。
像这样:
#[derive(Serialize, Deserialize, Debug)]
pub struct TeamSize {
pub max: i64,
pub min: i64,
};
由于您的属性名称是 JSON 属性(min
和 max
)的名称,因此您不需要使用 serde(rename)
.如果你的 Rust 结构使用字段 value_max
和 value_min
但你的 JSON 仍然使用 max
和 min
.
你会需要它
如果您绝对想将其解析为元组结构,则必须自己为您的自定义结构实现 Serialize
和 Deserialize
。不过,我认为这不值得麻烦,只需切换到结构而不是元组结构即可。
我有一个 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
);
如何解析?我应该自己实现一切吗?
#[derive(Serialize, Deserialize, Debug)]
pub struct TeamSize(
#[serde(rename = "min")]
pub i64,
#[serde(rename = "max")]
pub i64
);
不是有效代码,Serde rename
属性仅重命名正在序列化和反序列化的内容,它不会更改您的代码。在元组结构(您的第一个)中,您可以(并且必须)省略名称,因为您只需通过 self.0 和 self.1 访问它们,但是结构没有 first
或 second
字段,因此您必须为它们添加一个名称。
像这样:
#[derive(Serialize, Deserialize, Debug)]
pub struct TeamSize {
pub max: i64,
pub min: i64,
};
由于您的属性名称是 JSON 属性(min
和 max
)的名称,因此您不需要使用 serde(rename)
.如果你的 Rust 结构使用字段 value_max
和 value_min
但你的 JSON 仍然使用 max
和 min
.
如果您绝对想将其解析为元组结构,则必须自己为您的自定义结构实现 Serialize
和 Deserialize
。不过,我认为这不值得麻烦,只需切换到结构而不是元组结构即可。