0Pricing
Learn Rust Coding · レッスン

カスタムシリアライゼーション

フィールド属性

「カスタムシリアライゼーション」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. シリアライズとデシリアライズ
  2. JSONの操作
  3. カスタムシリアライゼーション
  4. その他の形式
← Learn Rust Codingに戻る