🐻

RustでJSONを扱う(serde_json) ファイルからJSONを読み込む

2023/08/13に公開

サンプル GitHub: 01_serde_json

ファイルからJSONを読み込む

前の記事では文字列からJSONを読み込んでいたが、当然普通はファイルからJSONを読みたい。
ファイルから読み込むには serde_json::from_reader を使う。

コード

ファイル読み込み

まず普通にファイルを読み込む。ファイルの中身は以下のコメント部分

const FILE_PATH: &str = "../resource/babel.json";
// {
//     "name": "Enoshima Sea Candle",
//     "height": 60
// }
let file: Result<File, std::io::Error> = File::open(FILE_PATH);
let file: File = match file {
    Ok(o) => o,
    Err(e) => {
        return Err(Box::new(e));
    }
};
let reader: BufReader<File> = BufReader::new(file);

Rust でファイルを読み込むときは BufReader を噛ませる。ファイルを一括で読み込むようになり、systemcallの呼び出し回数を減らすことができる。

パース

BufReaderから構造体 "Sample" に変換する。

#[derive(Deserialize, Debug)]
struct Sample {
    name: String,
    height: i32,
}
let json: Result<Sample, serde_json::Error> = from_reader::<BufReader<File>, Sample>(reader);
let json = match json {
    Ok(o) => o,
    Err(e) => {
        return Err(Box::new(e));
    }
};

出力

jsonの値を println! で出力するとファイルの中身が読み込めていることがわかる。

println!("{:?}", json);
Sample { name: "Enoshima Sea Candle", height: 60 }

Reference

Discussion