🦀
【Rust】Enumの数値をjsonにSerialize,Deserializeする方法
前提
WebApiで扱うJsonを構造体に変換する際にEnumを使いたいときに使えるserde_reprの紹介です。
サンプル
#[derive(Serialize,Deserialize)]
pub enum Status{
None = 0,
Hoge = 1,
Puge = 2,
}
#[derive(Serialize,Deserialize)]
pub struct Example{
status:Status
}
この構造があった場合に、
{status:1}
を
Example{
Status::Hoge
}
に変換したいときに使えます。
実装方法
[dependencies]
serde = "1.0"
serde_repr = "0.1"
Serialize,Deserialize
を Serialize_repr, Deserialize_repr
に置き換えて型をreprで指定するだけです。
use serde::{Deserialize, Serialize};
use serde_repr::{Serialize_repr, Deserialize_repr};
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug)]
#[repr(u8)]
pub enum Status {
None = 0,
Hoge = 1,
Puge = 2,
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
pub struct Example {
status: Status,
}
#[test]
fn test() {
let data = Example {
status: Status::Hoge,
};
let json = r#"{"status":1}"#;
assert_eq!(json, json!(data).to_string());
assert_eq!(serde_json::from_str::<Example>(json).unwrap(), data);
}
このように簡単に変換が行えるようになりました。
Discussion