JSON to C# クラス変換
JSONからC#クラスを自動生成
JSON入力
C#出力
JSONからC#への変換とは?
JSONからC#への変換とは、JSONデータから強力に型付けされたC#クラス定義を生成するプロセスです。.NETアプリケーションがAPIやコンフィグファイル、メッセージキューからJSONを受け取る場合、そのデータをオブジェクトに逆シリアル化するためのC#クラスが必要です。JSONにネストされたオブジェクト・配列・混在型が含まれる場合、これらのクラスを手書きするのは手間がかかりミスが起きやすい作業です。
JSONからC#クラスへの生成ツールは、JSONの構造と値を検査し、各フィールドに適切なC#型を推論し、プロパティアクセサーとシリアライゼーション属性を持つクラス定義を出力します。出力は.NETの命名規則に従います:PascalCaseのプロパティ名、元のcamelCaseまたはsnake_case形式のJSONキーへのマッピング用JsonPropertyName属性、そして配列に対するList'<'T'>'の正しい使用です。
この変換はASP.NET Core Web API、Azure Functions、および外部JSONデータを利用するあらゆる.NETサービスで特によく使われます。dynamicやDictionary'<'string, object'>'を使う代わりに、型付きクラスを使うことでコンパイル時の安全性、IntelliSenseサポート、そして実行時にしか発覚しないフィールド名のタイポへの対策が得られます。このツールにJSONを貼り付ければ、すぐに使えるC#クラスを即座に取得できます。
JSONからC#の生成ツールを使う理由
JSONサンプルからC#モデルクラスを手書きするには時間がかかり、人為的なミスが生じます。生成ツールが繰り返し作業を担うことで、ビジネスロジックに集中できます。
JSONからC#への変換ユースケース
JSONからC#への型マッピング早見表
各JSONの値型は特定のC#型に対応します。生成ツールは実際の値を分析して最も適切な型を選択します。たとえば、小数点のないJSON数値はintになり、3.14はdoubleになります。null値は実際の型をnullだけから推論できないため、object?(nullable参照型)になります。
| JSON型 | 値の例 | C#型 |
|---|---|---|
| string | "hello" | string |
| number (int) | 42 | int |
| number (float) | 3.14 | double |
| boolean | true, false | bool |
| null | null | object? |
| object | {"key": "value"} | nested class |
| array | [1, 2, 3] | List<int> |
| array of objects | [{"id": 1}] | List<ClassName> |
System.Text.Json と Newtonsoft.Json
.NETには2つの主要なJSONシリアライゼーションライブラリがあります。このツールが生成するクラスはSystem.Text.Json属性(JsonPropertyName)を使用します。これは.NET Core 3.0から組み込まれている選択肢です。プロジェクトがNewtonsoft.Jsonを使用している場合は属性を差し替えることができます。
コード例
以下の例では、JSONから生成したC#クラスの定義と使用方法を、2つの主要なシリアライゼーションライブラリを使って示します。加えて、コマンドラインから生成を自動化する方法も紹介します。
using System.Text.Json;
var json = """{"id": 1, "name": "Alice", "active": true}""";
var user = JsonSerializer.Deserialize<User>(json);
Console.WriteLine(user.Name); // → "Alice"
public class User
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
[JsonPropertyName("active")]
public bool Active { get; set; }
}using Newtonsoft.Json;
var json = @"{""id"": 1, ""name"": ""Alice"", ""scores"": [98, 85]}";
var user = JsonConvert.DeserializeObject<User>(json);
Console.WriteLine(user.Scores[0]); // → 98
public class User
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("scores")]
public List<int> Scores { get; set; }
}// Install: npm install -g quicktype
// Generate C# classes from JSON:
// quicktype --lang csharp --src data.json --out Models.cs
// From stdin:
// echo '{"id": 1, "name": "Alice"}' | quicktype --lang csharp
// Output:
// public class Root
// {
// [JsonPropertyName("id")]
// public int Id { get; set; }
//
// [JsonPropertyName("name")]
// public string Name { get; set; }
// }import json
def json_to_csharp(data: dict, class_name: str = "Root") -> str:
lines = [f"public class {class_name}", "{"]
type_map = {str: "string", int: "int", float: "double", bool: "bool"}
for key, value in data.items():
cs_type = type_map.get(type(value), "object")
prop = key[0].upper() + key[1:] # PascalCase
lines.append(f' [JsonPropertyName("{key}")]')
lines.append(f' public {cs_type} {prop} {{ get; set; }}')
lines.append('')
lines.append("}")
return "\n".join(lines)
data = json.loads('{"id": 1, "name": "Alice", "active": true}')
print(json_to_csharp(data))