😎

serde_json の to_value と from_value をうまく活用する

2024/03/30に公開

はじめに

Rust を扱っている中で、serde の Value を扱うケースが多くあり、
登場頻度のそこそこ高い、to_valuefrom_valueについてアウトプットします。

serde_json::Value について

ドキュメントにもある通り、Value の正体は enum で表現された列挙型です。
https://docs.rs/serde_json/latest/serde_json/value/enum.Value.html

▼ enum 型について
https://doc.rust-jp.rs/rust-by-example-ja/custom_types/enum.html

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 が安全に型の変換をおこなってくれるため非常に便利です。

参考になれば幸いです。

コラボスタイル Developers

Discussion