📄
serdeのシリアライズ/デシアライズ実例
説明
以下二つの構造体をserdeでjsonにシリアライズ/デシアライズするとどうなるのかの実例です。上をSimple, 下をComplexとしてます。
Self {
int_field: 1,
float_field: 2.3,
str_field: "foo".to_string(),
boolean_field: false,
}
Self {
desc: "it is complex".to_string(),
simple_1: Simple::default(), // Simpleは上の構造体
date: Local::now(),
}
実際のコードは👇。Cargo.tomlでserde
はderive
featureの入れ忘れに注意。& chronoを使う場合はfeatureにserde
を入れないと使用できません。
構造体を文字列にシリアライズ
Simpleをserde_json::to_string_pretty(&simple).unwrap()
でシリアライズした例。to_string_prettyの引数は参照にする必要がある。また、to_string_pretty()
は改行などを含む人間向けのシリアライズで、to_string()
なら1行に全て入れたシリアライズ。
{
// Simple structure
"int_field": 1,
"float_field": 2.3,
"str_field": "foo",
"boolean_field": false
}
{
// complex structure
"desc": "it is complex",
"simple_1": {
"int_field": 1,
"float_field": 2.3,
"str_field": "foo",
"boolean_field": false
},
"date": "2025-06-09T14:12:07.039653+09:00"
}
to_string()
で1行にした場合。complexを1行に。
println!("{}", serde_json::to_string(&complex).unwrap());
{"desc":"it is complex","simple_1":{"int_field":1,"float_field":2.3,"str_field":"foo","boolean_field":false},"date":"2025-06-09T14:51:53.342622+09:00"}
ファイルに保存後にデータ型として読む
ファイルからデータ型として読み込んで、Debugで表示したのですが基本的には変わらない? デシアライズでは型注釈が必要。束縛先の変数の型注釈かターボフィッシュで型を指定する。個人的には普通の変数では型注釈を書かないので、それに合わせて関数型に型を書きたい派。
// ファイルを読み込む
let loaded_simple_f = fs::read_to_string(&simple_path).unwrap();
// `from_str::<Simple>()`でターボフィッシュを使って、serde_jsonが何にデシアライズするかを示す。
let simple_deserialized = serde_json::from_str::<Simple>(&loaded_simple_f).unwrap();
Simple { int_field: 1, float_field: 2.3, str_field: "foo", boolean_field: false }
Comlex { desc: "it is complex", simple_1: Simple { int_field: 1, float_field: 2.3, str_field: "foo", boolean_field: false }, date: 2025-06-09T14:42:35.282669+09:00 }
マクロでここまで便利に書けるのはいいですね
Discussion