С появлением 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.
Спасибо за прочтение. Удачного кодирования.