カスタムシリアライゼーション
フィールド属性
「カスタムシリアライゼーション」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
serde をカスタマイズする
serde では属性を使って、フィールドを形式にどのように対応付けるかを細かく制御できます。#[serde(...)] によって、フィールド名の変更、フィールドの除外、デフォルト値の設定などを行えます。
フィールド名を変更する
rename を使うと、Rust のフィールド名を出力先の異なるキーに対応付けられます。JSON で別の命名規則を使う場合に便利です。
use serde::Serialize;
#[derive(Serialize)]
struct User {
#[serde(rename = "userName")]
user_name: String,
}すべての名前を変更する
rename_all を使うと、すべてのフィールドに一度に命名規則を適用できます。たとえば、Rust の snake_case を JSON の camelCase に変換できます。
use serde::Serialize;
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct User {
first_name: String,
last_name: String,
}フィールドを除外する
skip はフィールドを完全に除外します。skip_serializing_if は条件付きで除外するため、空のオプションを非表示にする場合などに使えます。
use serde::Serialize;
#[derive(Serialize)]
struct User {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
nickname: Option<String>,
}デシリアライズ時のデフォルト値
default は入力にフィールドがない場合に値を補うため、デシリアライズが失敗しないようにできます。
use serde::Deserialize;
#[derive(Deserialize)]
struct Config {
#[serde(default)]
retries: u32,
}カスタムデフォルト関数
default に関数を指定すると、ゼロ以外の代替値を提供できます。
use serde::Deserialize;
fn default_port() -> u16 { 8080 }
#[derive(Deserialize)]
struct Config {
#[serde(default = "default_port")]
port: u16,
}名前変更とデフォルト値をモデル化する
属性による処理は、キーの対応付けと代替値の設定だけです。この実行可能な例では、HashMap を使ってその動作を再現します。
use std::collections::HashMap;
fn main() {
let mut input: HashMap<&str, &str> = HashMap::new();
input.insert("userName", "Alice");
let user_name = input.get("userName").copied().unwrap_or("anon");
let port = input.get("port").copied().unwrap_or("8080");
println!("user_name={} port={}", user_name, port);
}デシリアライズ時のエイリアス
alias を使うと読み取り時に別名のキーも受け付けられます。古いフィールド名と新しいフィールド名の両方に対応する場合に便利です。
use serde::Deserialize;
#[derive(Deserialize)]
struct User {
#[serde(alias = "username")]
name: String,
}Flatten
flatten はネストした構造体のフィールドを親オブジェクトにインライン化し、JSON のネストを 1 階層減らします。
use serde::Serialize;
#[derive(Serialize)]
struct Meta { page: u32 }
#[derive(Serialize)]
struct Resp {
data: String,
#[serde(flatten)]
meta: Meta,
}モジュールによるカスタム処理
完全に制御したい場合は、serialize 関数と deserialize 関数を公開するモジュールを with に指定します。たとえば、タイムスタンプの形式を指定できます。
use serde::Serialize;
#[derive(Serialize)]
struct Event {
#[serde(with = "my_date_format")]
at: i64,
}列挙型のタグ付け
tag(内部タグ付き)や untagged を使って、列挙型のエンコード方法を制御できます。これにより、バリアント型の JSON の形状を決められます。
use serde::Serialize;
#[derive(Serialize)]
#[serde(tag = "type")]
enum Event {
Click { x: i32, y: i32 },
Key { code: u8 },
}理解度チェック
カスタムシリアライズについての理解度を確認しましょう。
まとめ
シリアライズをカスタマイズする方法を学びました。
renameとrename_allでフィールド名を対応付けますskipとskip_serializing_ifで出力を制御しますdefaultとaliasでデシリアライズを扱いやすくしますflatten、with、列挙型のtagで形状を処理します
次は、JSON 以外の形式です。
よくある質問
「カスタムシリアライゼーション」レッスンは無料ですか?
はい。「カスタムシリアライゼーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「カスタムシリアライゼーション」で何を学びますか?
フィールド属性 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「カスタムシリアライゼーション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- シリアライズとデシリアライズ
- JSONの操作
- カスタムシリアライゼーション
- その他の形式