Конвертер JSON в классы C#
Генерируйте классы C# со свойствами и атрибутами JsonProperty из JSON, готовые для Newtonsoft.Json.
Генерация классов C# из JSON
Десериализация JSON в .NET начинается с класса модели, свойства которого соответствуют данным. Конвертер напишет эти классы за вас: ключи в camelCase становятся свойствами в PascalCase с атрибутом [JsonProperty], хранящим исходный ключ, вложенные объекты — отдельными partial-классами, массивы — типизированными массивами, целые числа — long, а дробные — double. Также добавляются статический метод FromJson и метод расширения ToJson с настройками конвертеров для Newtonsoft.Json (Json.NET).
Как пользоваться
- Вставьте пример JSON — например, ответ API, который вызывает ваш сервис.
- Введите имя корневого класса, например Product.
- Установите NuGet-пакет Newtonsoft.Json, добавьте файл в проект, переименуйте пространство имён QuickType в своё и вызовите Product.FromJson(json).
Часто задаваемые вопросы
- Подходит ли это для System.Text.Json?
- Атрибуты и вспомогательные методы рассчитаны на Newtonsoft.Json. Для System.Text.Json оставьте свойства, замените [JsonProperty] на [JsonPropertyName] из System.Text.Json.Serialization и десериализуйте через 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 }
},
};
}
}