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にリネームしています。 name、company、blog、location、email、bioはnullになりうる(非公開ユーザもいる)ので、貼り付け後にOption<String>へ昇格させました。created_atとupdated_atは ISO 8601 文字列です。本物のDateTime<Utc>値が欲しい場合はStringをchrono::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 にも軽微な調整で流用可能です。