dud*_*bro 3 enums json rust serde
我有一个枚举:
#[derive(Serialize, Deserialize)]
enum Action {
Join,
Leave,
}
Run Code Online (Sandbox Code Playgroud)
和一个结构:
#[derive(Serialize, Deserialize)]
struct Message {
action: Action,
}
Run Code Online (Sandbox Code Playgroud)
我传递了一个 JSON 字符串:
"{\"action\":0}" // `json_string` var
Run Code Online (Sandbox Code Playgroud)
但是当我尝试像这样反序列化时:
let msg: Message = serde_json::from_str(json_string)?;
Run Code Online (Sandbox Code Playgroud)
我得到了错误expected value at line 1 column 11
。
在 JSON 中,如果我用0
字符串替换数字"Join"
,它会起作用,但我希望数字对应于Action
枚举的值(0
is Action::Join
、1
is Action::Leave
),因为它来自 TypeScript 请求。有没有一种简单的方法可以实现这一目标?
你要serde_repr
!
以下是该库自述文件中的示例代码:
use serde_repr::{Serialize_repr, Deserialize_repr};
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug)]
#[repr(u8)]
enum SmallPrime {
Two = 2,
Three = 3,
Five = 5,
Seven = 7,
}
fn main() -> serde_json::Result<()> {
let j = serde_json::to_string(&SmallPrime::Seven)?;
assert_eq!(j, "7");
let p: SmallPrime = serde_json::from_str("2")?;
assert_eq!(p, SmallPrime::Two);
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
对于你的情况:
use serde_repr::{Serialize_repr, Deserialize_repr};
#[derive(Serialize_repr, Deserialize_repr)]
#[repr(u8)]
enum Action {
Join = 0,
Leave = 1,
}
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Message {
action: Action,
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2054 次 |
最近记录: |