🐻

RustでJSONを扱う(serde_json) 基本

2023/08/13に公開

サンプル GitHub: 00_serde_json

serde_json

RustJSON を扱うとなると serde_json がよく使われる。

クレートの追加

cargo add serde
cargo add serde_json

後述の"構造体に直接JSONを入れる"ようなことをする場合、serdeは

cargo add serde --features="derive"

とする。

Deserialize

構造体に基づいたJSONを読み込み、構造体に直接代入する。

構造体

以下のような構造体を準備する。
Stringの "name" と i32 の "height" をフィールドに持つ "Sample" という構造体である。

#[derive(Deserialize)]
struct Sample {
    name: String,
    height: i32,
}

JSON

ここに上の構造体に合うようなJSONな文字列 変数名: "BABEL" を準備する。

const BABEL: &str = r#"{
  "name": "Enoshima Sea Candle",
  "height": 60
}
"#;

Deserialize

serde_json::from_str を使って文字列を "Sample" に変換する

fn main() {
    let json_sample: Result<Sample, serde_json::Error> = from_str::<Sample>(BABEL);
    match json_sample {
        Ok(o) => {
            println!("Success to perse BABEL");
            println!("    {} (height: {}m)", o.name, o.height);
        }
        Err(e) => {
            println!("Failed to perse BABEL");
            println!("    Error: {}", e);
        }
    }
}

出力

JSONを構造体へ変換し、以下のように出力することができる。

Success to perse BABEL
    Enoshima Sea Candle (height: 60m)

また挙動として、未知のキーが含まれていてもパースは成功する。
しかし、 "キーが存在しない" 場合や、"JSONのファイルや文字列が壊れている" 場合は失敗する。

Reference

Discussion