😎
serde_json の to_value と from_value をうまく活用する
はじめに
Rust を扱っている中で、serde の Value を扱うケースが多くあり、
登場頻度のそこそこ高い、to_value
と from_value
についてアウトプットします。
serde_json::Value について
ドキュメントにもある通り、Value
の正体は enum で表現された列挙型です。
▼ enum 型について
json!
マクロを呼び出せば、簡単に Value
型の値を生成することができます。
let v = json!(null);
serde_json::Value → 自前の Struct
Value 型を自前の Struct に変換します。
#[derive(Deserialize, Debug)]
struct User {
name: String,
age: u8,
}
let j = json!({
"name": "Shota",
"age": 26
});
let u: User = serde_json::from_value(j).unwrap();
println!("{:#?}", u);
from_value()
を呼び出し、引数に Struct を入れるだけで User に変換してくれます。
ポイントは #[derive(Deserialize, Debug)]
の部分で、Debug
はデバッグコードを仕込んでいる関係上、存在しますが、Deserialize
で Value をデシリアライズしてくれます。
自前の Struct → serde_json::Value
今度は自前の Struct を使って Value 型に変換します。
#[derive(Serialize)]
struct User {
name: String,
age: u8,
}
let u = User {
name: "Shota".to_string(),
age: 26,
};
let v = serde_json::to_value(u).unwrap();
println!("{}", v);
to_value()
を呼び出し、引数に Struct を入れるだけで簡単に serde_json::Value に変換してくれます。
これもポイントは #[derive(Serialize)]
の部分で、シリアライズ可能な Struct であることとする必要があります。
おわりに
このようにかなり簡単にシリアライズ、デシリアライズすることが可能です。
serde が安全に型の変換をおこなってくれるため非常に便利です。
参考になれば幸いです。
Discussion