0Pricing
C# Academy · Урок

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 включить в 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 — локальная установка не требуется.

Все уроки этого курса

  1. System.IO (пути и потоки)
  2. JSON с System.Text.Json (явное включение и конвертеры)
  3. Простые шаблоны разбора CSV
← Назад к C# Academy