JSON to Rust 構造体: GitHub User API

GitHub /users/{username} のレスポンスを serde、snake_case フィールド、Option フィールドつきの完全な Rust 構造体階層に変換する手順を解説します。

Real-World

詳細な説明

実例: GitHub User エンドポイント

GitHub REST API の GET /users/{username} は、ネストオブジェクト、任意フィールド、タイムスタンプを含む豊富な JSON を返します。コンバーターの中規模サンプルとして格好の題材です。

サンプルレスポンス(抜粋)

{
  "login": "octocat",
  "id": 583231,
  "node_id": "MDQ6VXNlcjU4MzIzMQ==",
  "avatar_url": "https://avatars.githubusercontent.com/u/583231?v=4",
  "html_url": "https://github.com/octocat",
  "type": "User",
  "site_admin": false,
  "name": "The Octocat",
  "company": "@github",
  "blog": "https://github.blog",
  "location": "San Francisco",
  "email": null,
  "bio": null,
  "public_repos": 8,
  "followers": 9001,
  "following": 9,
  "created_at": "2011-01-25T18:44:36Z",
  "updated_at": "2024-05-10T17:20:11Z"
}

自動生成された Rust(軽く整形)

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GitHubUser {
    pub login: String,
    pub id: i64,
    pub node_id: String,
    pub avatar_url: String,
    pub html_url: String,
    #[serde(rename = "type")]
    pub user_type: String,
    pub site_admin: bool,
    pub name: Option<String>,
    pub company: Option<String>,
    pub blog: Option<String>,
    pub location: Option<String>,
    pub email: Option<String>,
    pub bio: Option<String>,
    pub public_repos: i32,
    pub followers: i32,
    pub following: i32,
    pub created_at: String,
    pub updated_at: String,
}

注目すべき調整点

  • JSON キー type は Rust の予約語と衝突するため、コンバーターは r#type#[serde(rename = "type")] を出力します。上記の例では読みやすさのために user_type にリネームしています。
  • namecompanybloglocationemailbionull になりうる(非公開ユーザもいる)ので、貼り付け後に Option<String> へ昇格させました。
  • created_atupdated_at は ISO 8601 文字列です。本物の DateTime<Utc> 値が欲しい場合は Stringchrono::DateTime<chrono::Utc> に置き換え、chrono = { version = "0.4", features = ["serde"] } を Cargo.toml に追加してください。

API の呼び出し

let resp: GitHubUser = reqwest::get("https://api.github.com/users/octocat")
    .await?
    .json()
    .await?;

println!("{} has {} followers", resp.login, resp.followers);

学べること

このひとつのエンドポイントだけで、コンバーターの 6 つの機能(snake_case マッピング、整数幅選択、Option 昇格、予約語回避、構造体命名、serde derive)を一度に試せます。実プロジェクトの API クライアントを書く際のテンプレートとして活用してください。

ユースケース

Rust 製の GitHub クライアント、ステータスダッシュボード、コントリビューター分析ツールなど、GitHub REST API を消費するすべての用途に応用できます。同じ手順は GitLab、Bitbucket、Forgejo の API にも軽微な調整で流用可能です。

試してみる — JSON to Rust Struct Converter

フルツールを開く