JSON с System.Text.Json (явное включение и конвертеры)
JSON в стиле, совместимом с C# 6: используйте DataContractJsonSerializer с [DataContract]/[DataMember] (явно включаемыми членами) и простыми изменениями имен, аналогичными конвертерам.
«JSON с System.Text.Json (явное включение и конвертеры)» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
JSON в C# 6: план
Цель: сериализовать и десериализовать JSON без внешних пакетов.
- Используйте DataContractJsonSerializer
- Явно включайте члены с помощью DataMember
- Настраивайте имена с помощью Name=
- Безопасно записывайте и читайте файлы
Модель с явным включением
В модели с явным включением пометьте тип атрибутом DataContract, а только нужные члены — атрибутом DataMember. Используйте Name=, чтобы управлять ключами JSON.
using System;
using System.Runtime.Serialization;
[DataContract] // opt-in: only [DataMember] will be serialized
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
// Not included: no DataMember
public string InternalNote { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
User u = new User { Id = 7, Name = "Ada", InternalNote = "hidden" };
Console.WriteLine("Ready to serialize: " + u.Name);
}
}
Сериализация в JSON
Создайте DataContractJsonSerializer, выполните запись в поток и закодируйте поток в строку в формате UTF-8.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
[DataContract]
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
public string InternalNote { get; set; }
}
public class Program
{
public static string ToJson(User u)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
using (MemoryStream ms = new MemoryStream())
{
ser.WriteObject(ms, u);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
public static void Main(string[] args)
{
User u = new User { Id = 1, Name = "Ada", InternalNote = "not saved" };
string json = ToJson(u);
Console.WriteLine(json); // {"id":1,"name":"Ada"}
}
}
Десериализация из JSON
Для десериализации прочитайте данные из потока. Значения будут присвоены только полям с атрибутом DataMember.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
[DataContract]
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
public class Program
{
public static User FromJson(string json)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
byte[] bytes = Encoding.UTF8.GetBytes(json);
using (MemoryStream ms = new MemoryStream(bytes))
{
return (User)ser.ReadObject(ms);
}
}
public static void Main(string[] args)
{
string json = "{\"id\":42,\"name\":\"Bob\"}";
User u = FromJson(json);
Console.WriteLine(u.Id + " - " + u.Name);
}
}
Сохранение и загрузка файлов JSON
Сохраняйте JSON с помощью FileStream в блоках using. Такой подход отражает работу реальных приложений: настройки, небольшие объёмы данных и тому подобное.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
[DataContract]
public sealed class Settings
{
[DataMember(Name = "theme")]
public string Theme { get; set; }
[DataMember(Name = "notifications")]
public bool Notifications { get; set; }
}
public class Program
{
public static void Save(string path, Settings s)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Settings));
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
ser.WriteObject(fs, s);
}
}
public static Settings Load(string path)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Settings));
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
return (Settings)ser.ReadObject(fs);
}
}
public static void Main(string[] args)
{
string path = "settings.json";
Save(path, new Settings { Theme = "dark", Notifications = true });
Settings loaded = Load(path);
Console.WriteLine(loaded.Theme + " / " + loaded.Notifications);
}
}
Имена и простые преобразования
Настройка:
- Используйте Name= в DataMember для сопоставления имён свойств, например user_name
- Для перечислений помечайте каждое значение атрибутом EnumMember
- Для специальных форматов, таких как даты и числа, в C# 6 преобразуйте значение в строковое свойство вручную
Правило явного включения для JSON
Итоги
Итоги: используйте DataContractJsonSerializer в C# 6, явно включайте члены с помощью DataMember, изменяйте имена через Name= и безопасно читайте и записывайте данные, применяя шаблоны работы с потоками.
Часто задаваемые вопросы
Урок «JSON с System.Text.Json (явное включение и конвертеры)» бесплатный?
Да — полный текст урока «JSON с System.Text.Json (явное включение и конвертеры)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.
Чему я научусь в уроке «JSON с System.Text.Json (явное включение и конвертеры)»?
JSON в стиле, совместимом с C# 6: используйте DataContractJsonSerializer с [DataContract]/[DataMember] (явно включаемыми членами) и простыми изменениями имен, аналогичными конвертерам. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «JSON с System.Text.Json (явное включение и конвертеры)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- System.IO (пути и потоки)
- JSON с System.Text.Json (явное включение и конвертеры)
- Простые шаблоны разбора CSV