Cas*_*eyB 7 rust serde serde-json
我有一个 JSON 结构,如下所示:
{ "type": "suite", "event": "started", "test_count": 1 }
Run Code Online (Sandbox Code Playgroud)
我想反序列化为这些结构:
#[derive(Debug, Deserialize)]
enum ResultType {
Suite,
Test,
}
#[derive(Debug, Deserialize)]
enum ResultEvent {
Started,
Failed,
Ok,
}
#[derive(Debug, Deserialize)]
struct JsonResult {
#[serde(rename(deserialize = "type"))]
test_type: ResultType,
event: ResultEvent,
test_count: Option<u32>,
}
Run Code Online (Sandbox Code Playgroud)
我找不到让 serde_json 使用正确大小写的方法。我不断收到这些错误:
{ "type": "suite", "event": "started", "test_count": 1 }
Run Code Online (Sandbox Code Playgroud)
如果我将枚举值的大小写更改为全部小写或全部大写,则它可以工作,但我希望能够使用 PascalCase。
Cod*_*256 17
你只需要放在#[serde(rename_all = "snake_case")]枚举定义之前。
其他可能的值是lowercase,UPPERCASE,PascalCase,camelCase,snake_case,SCREAMING_SNAKE_CASE,kebab-case,和SCREAMING-KEBAB-CASE。
如果你想支持不同的大小写,你可以alias在枚举变体上添加一个:
enum ResultType {
#[serde(alias="suite", alias="SUITE")]
Suite,
#[serde(alias="test", alias="TEST")]
Test,
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下, 、"Suite"或"suite"都是"SUITE"可以接受的。
而任何其他类似的情况"sUitE",一定有问题。
用于#[serde(rename = "name")]在序列化和反序列化时更改用于枚举变量的字符串。
#[derive(Debug, Deserialize)]
enum ResultType {
#[serde(rename = "suite")]
Suite,
#[serde(rename = "test")]
Test,
}
#[derive(Debug, Deserialize)]
enum ResultEvent {
#[serde(rename = "started")]
Started,
#[serde(rename = "failed")]
Failed,
#[serde(rename = "ok")]
Ok,
}
#[derive(Debug, Deserialize)]
struct JsonResult {
#[serde(rename(deserialize = "type"))]
test_type: ResultType,
event: ResultEvent,
test_count: Option<u32>,
}
Run Code Online (Sandbox Code Playgroud)
您还可以#[serde(alias = "name")]在反序列化时添加额外的字符串以接受。
详细信息请参阅 serde 文档:https://serde.rs/variant-attrs.html
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |