JSON 转 C# 类工具
从 JSON 生成带属性和 JsonProperty 特性的 C# 类,可直接配合 Newtonsoft.Json 使用。
从 JSON 生成 C# 类
在 .NET 中反序列化 JSON,第一步是编写一个属性与数据结构相对应的模型类。本工具会替你生成这些类:camelCase 键会变成 PascalCase 属性,并通过 [JsonProperty] 特性保留原始键名;嵌套对象会生成独立的 partial 类;数组会生成类型化数组;整数映射为 long,小数映射为 double。它还会为 Newtonsoft.Json(Json.NET)生成一个静态 FromJson 方法和一个 ToJson 扩展方法,并附带转换器设置。
使用方法
- 粘贴一段 JSON 样例,例如你的服务所调用 API 的响应。
- 输入根类名称,例如 Product。
- 安装 Newtonsoft.Json NuGet 包,将文件添加到项目中,把 QuickType 命名空间改成你自己的,然后调用 Product.FromJson(json)。
常见问题
- 可以配合 System.Text.Json 使用吗?
- 生成的特性和辅助方法面向 Newtonsoft.Json。如果使用 System.Text.Json,可以保留属性,把 [JsonProperty] 替换为 System.Text.Json.Serialization 中的 [JsonPropertyName],再用 JsonSerializer.Deserialize<Product>(json) 进行反序列化。
- 为什么数字生成为 long 和 double?
- JSON 数字没有固定大小,使用 long 和 double 可以避免意外溢出。如果业务需要,复制后可以改为 int 或 decimal,例如金额通常使用 decimal。
- 为什么类被声明为 partial?
- partial 类可以让生成的属性和 FromJson 辅助方法分布在不同的声明中,也方便你在另一个文件中添加自己的成员,而无需修改生成的代码。
示例:JSON 转 C#
输入 JSON
{
"productId": 7,
"title": "Mechanical Keyboard",
"price": 129.99,
"inStock": true,
"tags": ["hardware", "usb-c"]
}生成的 C# 代码(Product)
// <auto-generated />
//
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
// using QuickType;
//
// var product = Product.FromJson(jsonString);
namespace QuickType
{
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class Product
{
[JsonProperty("productId")]
public long ProductId { get; set; }
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("price")]
public double Price { get; set; }
[JsonProperty("inStock")]
public bool InStock { get; set; }
[JsonProperty("tags")]
public string[] Tags { get; set; }
}
public partial class Product
{
public static Product FromJson(string json) => JsonConvert.DeserializeObject<Product>(json, QuickType.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this Product self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
}