JSON 转 C# 类工具

从 JSON 生成带属性和 JsonProperty 特性的 C# 类,可直接配合 Newtonsoft.Json 使用。

从 JSON 生成 C# 类

在 .NET 中反序列化 JSON,第一步是编写一个属性与数据结构相对应的模型类。本工具会替你生成这些类:camelCase 键会变成 PascalCase 属性,并通过 [JsonProperty] 特性保留原始键名;嵌套对象会生成独立的 partial 类;数组会生成类型化数组;整数映射为 long,小数映射为 double。它还会为 Newtonsoft.Json(Json.NET)生成一个静态 FromJson 方法和一个 ToJson 扩展方法,并附带转换器设置。

使用方法

  1. 粘贴一段 JSON 样例,例如你的服务所调用 API 的响应。
  2. 输入根类名称,例如 Product。
  3. 安装 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 }
            },
        };
    }
}

将 JSON 转换为其他语言