С появлением ASP.NET Core 3.0 сериализатор JSON по умолчанию был изменен с Newtonsoft.Json на собственный System.Text.Json. В этом сообщении блога мы рассмотрим некоторые основные способы использования сериализации и десериализации JSON. Полное решение можно найти в этом репозитории GitHub.

Краткое введение в быструю встроенную поддержку JSON

Новая встроенная поддержка JSON, System.Text.Json, отличается высокой производительностью, малым объемом памяти и основана на Span<byte>. Все это происходит автоматически и встроено в .NET Core 3.0. Но если ваш проект нацелен на .NET Standard или .NET framework (v4.6.1 +), вам необходимо установить пакет NuGet System.Text.Json, или вы можете продолжать использовать Json.NET или другой популярные библиотеки JSON.

Несмотря на то, что было много дискуссий о библиотеке JSON для .NET Core (ссылка), для большинства пользователей .NET это хорошая новость - увидеть собственную библиотеку JSON. Кроме того, есть несколько статей о тестах (link1, link2, link3,…), которые показывают, что пространство имен System.Text.Json обеспечивает лучшую производительность в большинстве случаев использования по сравнению с другими библиотеками JSON. Microsoft проделала отличную работу!

Пространство имен System.Text.Json обеспечивает высокопроизводительные, не требующие выделения ресурсов и соответствующие стандартам возможности для обработки нотации объектов JavaScript (JSON), которая включает сериализацию объектов в текст JSON и десериализацию текста JSON в объекты со встроенной поддержкой UTF-8. -в. Он также предоставляет типы для чтения и записи текста JSON, закодированного как UTF-8, и для создания объектной модели документа в памяти (DOM) для произвольного доступа к элементам JSON в структурированном представлении данных.

- Пространство имен System.Text.Json из Microsoft Docs

Обязательный к прочтению учебник от Microsoft Docs

В Microsoft Docs есть очень хорошая статья с практическими рекомендациями: Как сериализовать и десериализовать JSON в .NET. Несмотря на то, что оно все еще находится в стадии разработки, в этой статье было рассмотрено множество вариантов использования пространства имен System.Text.Json.

В оставшейся части этого сообщения в блоге я покажу некоторые распространенные варианты использования сериализации и десериализации JSON.

Использование JsonSerializer

Давайте рассмотрим класс модели MyModel, который определяется следующим образом.

Этот класс содержит некоторые свойства общих типов объектов в C #. Мы собираемся десериализовать файл JSON в экземпляр объекта MyModel. Файл JSON «my-model.json» выглядит следующим образом.

Десериализовать строку JSON в класс модели C # просто с помощью метода JsonSerializer.Deserialize в пространстве имен System.Text.Json. С другой стороны, мы можем использовать метод JsonSerializer.Serialize для сериализации экземпляра объекта MyModel в строку JSON. В следующем фрагменте кода показан пример.

Строки с 3 по 6 определяют параметры сериализатора JSON. Доступен набор опций (ссылка). Здесь явно заданы два свойства в параметрах. Первый, PropertyNamingPolicy, указывает сериализатору использовать CamelCase для десериализации и сериализации, чтобы свойство с именем MyProperty в классе C # совпадало с ключом myProperty в объекте JSON и наоборот. Второй, WriteIndented = true, означает, что сериализованная строка JSON должна использовать красивую печать с правильными отступами. Консольный вывод приведенного выше кода похож на следующий снимок экрана.

Приведенный выше пример - идеальный случай; все работает как надо. Однако иногда нам приходится иметь дело с объектами JSON, которые не соответствуют соглашению об именах. В этом случае мы можем использовать встроенную аннотацию атрибутов JsonPropertyName, чтобы сопоставить свойство в классе C # с ключом в объекте JSON. В следующем фрагменте кода показан пример того, как свойство Name сопоставляется с парой ключ-значение «_full_name» в строке JSON.

В приведенном выше примере есть еще один атрибут JsonIgnore. Этот атрибут может подавлять аннотированное свойство в процессе сериализации.

Использование JsonDocument

Иногда у нас есть большой объект JSON, и мы заботимся только о очень небольшой его части. В этом случае мы можем использовать JsonDocument в пространстве имен System.Text.Json.

JsonDocument предоставляет механизм для изучения структурного содержания значения JSON без автоматического создания экземпляров значений данных. JsonDocument может анализировать значение JSON и генерировать объектную модель документа (DOM) в памяти для произвольного доступа и перечисления элементов JSON.

В следующем фрагменте кода показан пример.

В этом примере мы сначала разрешаем JsonDocument анализировать строку JSON и получаем RootElement значения JSON. С RootElement мы можем запрашивать значение напрямую по ключу в объекте JSON. Преобразование типов поддерживает большинство примитивных типов. Кроме того, мы можем перечислить JsonElement. Например, в строках с 12 по 17 показано, как работать с массивом в JSON и преобразовывать его в список на C #.

Это все на сегодня. Поскольку я коснулся только некоторых очень основных областей пространства имен System.Text.Json, пожалуйста, убедитесь, что вы прочитали официальное руководство (ссылка), которое включает больше примеров, объяснений и обсуждений.

Более того, вы можете узнать больше из проекта модульного тестирования для пространства имен System.Text.Json в этом репозитории GitHub.

Спасибо за прочтение. Удачного кодирования.