🦀

【Rust】Enumの数値をjsonにSerialize,Deserializeする方法

2022/10/17に公開

前提

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