JSON转C#类

从JSON生成C#类

加载示例
根类名称:

JSON输入

C#输出

本地运行 · 粘贴密钥安全无忧
C#类将显示在这里…

什么是JSON转C#转换?

JSON转C#转换是指从JSON数据生成强类型C#类定义的过程。当.NET应用程序从API、配置文件或消息队列接收JSON数据时,需要借助C#类将其反序列化为对象。手动编写这些类既繁琐又容易出错,尤其是当JSON包含嵌套对象、数组和混合类型时。

JSON转C#类生成器会检查JSON的结构和值,为每个字段推断合适的C#类型,并生成带有属性访问器和序列化特性的类定义。输出结果遵循.NET命名规范:属性名使用PascalCase,通过JsonPropertyName特性映射原始camelCase或snake_case JSON键,并对数组使用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数据不会离开您的设备,API密钥、令牌和个人信息始终保持私密。
📋
正确的特性映射
生成的类包含JsonPropertyName特性,将PascalCase C#属性映射到原始JSON键名,防止反序列化不匹配。
🌐
无需账号或安装
打开页面,粘贴JSON即可使用。无需安装NuGet包,无需配置Visual Studio扩展,无需注册。

JSON转C#使用场景

后端API集成
为第三方REST API生成请求和响应模型。粘贴API文档中的示例JSON,即可获得可直接用于HttpClient调用的C#类。
ASP.NET Core控制器
为Action方法参数创建模型类。当端点接受JSON请求体时,生成的类可自动完成模型绑定和验证。
Azure Functions与无服务器
为处理队列、事件中心或HTTP触发器中JSON消息的Azure Functions构建输入和输出绑定。
配置反序列化
将appsettings.json的各节或外部配置文件转换为强类型C#选项类,配合依赖注入中的IOptions'<'T'>'使用。
数据库填充与迁移
将JSON数据文件转换为C#对象,用于Entity Framework种子数据、集成测试配置或数据迁移脚本。
学习C#类型系统
.NET新手学员和开发者可通过此工具了解JSON类型与C#类型的对应关系,理解属性访问器,并通过示例学习序列化特性。

JSON与C#类型映射参考

每种JSON值类型对应一个特定的C#类型。生成器会分析实际值以选择最精确的类型。例如,没有小数点的JSON数字会转换为int,而3.14则转换为double。null值生成object?(可空引用类型),因为仅凭null无法推断实际类型。

JSON类型示例C#类型
string"hello"string
number (int)42int
number (float)3.14double
booleantrue, falsebool
nullnullobject?
object{"key": "value"}nested class
array[1, 2, 3]List<int>
array of objects[{"id": 1}]List<ClassName>

System.Text.Json与Newtonsoft.Json

.NET有两个主要的JSON序列化库。此工具生成的类使用System.Text.Json特性(JsonPropertyName),这是.NET Core 3.0以来的内置选项。如果您的项目使用Newtonsoft.Json,可以替换相应特性。

System.Text.Json
自.NET Core 3.0起内置。比Newtonsoft速度更快、内存占用更低。使用[JsonPropertyName]进行属性映射。新建.NET 6+项目的默认选择。不开箱支持JsonPath或引用处理等Newtonsoft特有功能。
Newtonsoft.Json
最初的.NET JSON库(Json.NET)。使用[JsonProperty]进行属性映射。支持更高级的场景:多态序列化、JsonPath查询、更灵活的自定义转换器。在遗留代码库以及需要System.Text.Json所缺功能的项目中仍广泛使用。

代码示例

以下示例展示如何定义和使用从JSON生成的C#类,涵盖两个主要序列化库的用法,以及如何通过命令行自动化生成流程。

C# (System.Text.Json)
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; }
}
C# (Newtonsoft.Json)
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; }
}
JavaScript (quicktype)
// 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; }
// }
Python (generate C# from JSON)
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))

常见问题

JsonPropertyName与JsonProperty有什么区别?
JsonPropertyName是System.Text.Json(.NET内置序列化器)的特性;JsonProperty则来自第三方库Newtonsoft.Json(Json.NET)。两者都能将C#属性名映射到JSON字段名,但属于不同命名空间,不可互换。新建.NET 6+项目请使用JsonPropertyName,若项目已依赖Newtonsoft则使用JsonProperty。
生成器如何处理嵌套JSON对象?
每个嵌套对象都会生成独立的C#类,父类中的属性使用该嵌套类作为类型。例如,若JSON中有一个"address"字段,包含"street"和"city"两个字段,生成器会创建一个Address类,并在父类中将该属性类型设为Address。
包含混合类型的JSON数组如何处理?
生成器从第一个非null元素推断数组元素类型。若数组包含混合类型(字符串与数字混用),生成的类型会退回为List'<'object'>'。实际上,结构良好的API响应很少在同一数组中混用类型。
生成的类能与Entity Framework一起使用吗?
可以,但需要额外添加EF专用注解,如[Key]、[Required]或[Column]特性。生成的类提供属性结构,可将其作为脚手架,在此基础上添加EF配置。EF还需要无参构造函数,生成的类默认已具备此构造函数。
JSON中的null值如何转换为C#?
JSON null值会生成object?类型,因为生成器仅凭null无法确定实际类型。生成后,您应根据对API Schema的了解,将object?替换为正确的可空类型(如string?、int?或具体类名?)。
camelCase的JSON键会自动映射为PascalCase的C#属性吗?
会。生成器将"firstName"这样的JSON键转换为FirstName这样的PascalCase属性,并添加[JsonPropertyName("firstName")]特性,确保序列化器在序列化和反序列化时自动完成两种命名规范之间的映射。
如何处理带有可选字段的JSON?
将属性类型设为可空(如string?或int?)并设置默认值。使用System.Text.Json时,还可以配置JsonSerializerOptions.DefaultIgnoreCondition,在序列化时跳过null值。生成器默认生成不可空类型,请根据API契约自行检查并调整可空性。