RustでJSONをStructにパースする

単なる平らなオブジェクトなら最悪並べていけばいいですけど、複雑な構造の場合は結構面倒です。この点はserde_drive::Deserializeを使えば結構スムーズにパースできるようです。試してみます。

まず、Cargo.toml はこんな感じ

[dependencies]
serde = "1.0.*"
serde_json = "1.0.*"
serde_derive = "1.0.*"

コードはこんな感じ

use serde_derive::Deserialize;

fn main() {
    let json = r#"{"name":"taro","age":20,"hobby":{"name":"game"}}"#;

    #[derive(Debug, Deserialize, PartialEq)]
    struct Human {
        name: String,
        age: u8,
        hobby: Option<Hobby>,
    }

    #[derive(Debug, Deserialize, PartialEq)]
    struct Hobby {
        name: String,
    }

    assert_eq!(
        serde_json::from_str::<Human>(&json).unwrap(),
        Human {
            name: "taro".into(),
            age: 20,
            hobby: Some(Hobby {
                name: "game".into()
            })
        }
    );
}

これでどんなJSONでもどんとこいですね