Содержание
В .NET 6 появилось новое пространство имен под названием System.
. В этом пространстве имен содержатся классы для работы с JSON-документом как с DOM (Document Object Model), что позволяет получать произвольный доступ к элементам JSON-документа.
Классы и структуры System. Text. Json. Nodes
В System.
содержатся следующие классы и структуры:
JsonNode
— базовый класс, представляющий отдельный узел в изменяемом документе JSON.JsonObject
— класс, представляющие изменяемый объект JSON.JsonArray
— класс, представляющий изменяемый массив JSON.JsonValue
— класс, представляющий изменяемое значение JSON.JsonNodeOptions
— структура, представляющая параметры управления поведением дляJsonNode
.
Пример чтения JSON DOM в C#
Рассмотрим пример чтения JSON с использованием классов из пространства имен System.
. В качестве примера, используем вот такой объект JSON:
{ "Date": "2019-08-01T00:00:00-07:00", "TemperatureCelsius": 25, "Summary": "Hot", "DatesAvailable": [ "2019-08-01T00:00:00-07:00", "2019-08-02T00:00:00-07:00" ], "TemperatureRanges": { "Cold": { "High": 20, "Low": -10 }, "Hot": { "High": 60, "Low": 20 } }, "SummaryWords": [ "Cool", "Windy", "Humid" ] }
Получим произвольный доступ к некоторым элемента этого JSON:
using System.Text.Json.Nodes; const string json = "{ \"Date\": \"2019-08-01T00:00:00 - 07:00\", \"TemperatureCelsius\": 25, \"Summary \": \"Hot\", \"DatesAvailable\": [ \"2019 - 08 - 01T00: 00:00 - 07:00\", \"2019 - 08 - 02T00: 00:00 - 07:00\" ], \"TemperatureRanges\": { \"Cold \": { \"High\": 20, \"Low\": -10 }, \"Hot\": {\"High\": 60, \"Low\": 20 } }, \"SummaryWords\": [\"Cool\", \"Windy\", \"Humid\" ] }"; JsonNode? data = JsonObject.Parse(json); if (data == null) Console.WriteLine("Не удалось прочитать JSON"); //доступ к массиву DatesAvailable JsonArray jsonArray = data["DatesAvailable"].AsArray(); foreach (var element in jsonArray) Console.WriteLine(element.AsValue().ToString()); //доступ к объекту TemperatureRanges.Hot JsonObject jsonHot = data["TemperatureRanges"]["Hot"].AsObject(); //получение значений из пар High и Low Console.WriteLine(jsonHot["High"].GetValue<int>()); Console.WriteLine(jsonHot["Low"].GetValue<int>());
Класс Json Node
У класса JsonNode
определены следующие свойства:
Item[Int32]
— возвращает или задает элемент по указанному индексуItem[String]
возвращает или задает элемент с указанным именем свойства. Если свойство не найдено, то возвращается значениеnull
.Options
— параметры для управления поведением.Parent
— возвращает родительский узелJsonNode
. Если родительский объект отсутствует, то возвращаетсяnull
. Родительский объект может иметь значениеJsonObject
илиJsonArray
.Root
— возвращает кореньJsonNode
для текущего узла. Если текущий объектJsonNode
является корневым, то возвращаетсяnull
.
Основные методы JsonNode
:
As
— приводит текущий узел к типуArray() JsonArray
.As
— приводит текущий узел к типуObject() JsonObject
.As
— приводит текущий узел к типуValue() JsonValue
.Get
— возвращает путь JSON.Path() Get
— возвращает значение для текущего узла.Value<T>() Parse()
— выполняет синтаксический анализ текста, представляющего значение JSON.To
— преобразует текущий экземпляр в строку в формате JSON.Json String() Write
— записываетTo() JsonNode
в предоставленный экземплярUtf8JsonWriter
.
В представленном выше примере продемонстрирована работа некоторых свойств и методов класса JsonNode
.
Класс JsonObject
Класс JsonObject
является наследником класса JsonNode
, поэтому ниже представлены только свойства и методы не унаследованные от JsonNode
:
Свойства JsonObject
:
Count
— возвращает количество элементов, содержащихся вJsonObject
Методы JsonObject
Add()
— добавляет указанное свойство вJsonObject
.Clear()
удаляет из коллекцииJsonObject
все элементы.ContainsKey()
определяет, содержит лиJsonObject
элемент с указанным именем свойства.Try
— возвращает значение свойства с указанным именем.Get Property Value() Get
— возвращает перечислитель, осуществляющий перебор списка элементовEnumerator() JsonObject
.
Пример использования свойств и методов класса JsonObject
using System.Text.Json.Nodes; const string json = "{ \"Date\": \"2019-08-01T00:00:00 - 07:00\", \"TemperatureCelsius\": 25, \"Summary \": \"Hot\", \"DatesAvailable\": [ \"2019 - 08 - 01T00: 00:00 - 07:00\", \"2019 - 08 - 02T00: 00:00 - 07:00\" ], \"TemperatureRanges\": { \"Cold \": { \"High\": 20, \"Low\": -10 }, \"Hot\": {\"High\": 60, \"Low\": 20 } }, \"SummaryWords\": [\"Cool\", \"Windy\", \"Humid\" ] }"; JsonObject? data = JsonObject.Parse(json).AsObject(); if (data == null) Console.WriteLine("Не удалось прочитать JSON"); Console.WriteLine($"Количество элементов: {data.Count}"); var elements = data.GetEnumerator(); while (elements.MoveNext()) { Console.WriteLine($"Имя пары: {elements.Current.Key}");
Результат:
Имя пары: TemperatureCelsius
Имя пары: Summary
Имя пары: DatesAvailable
Имя пары: TemperatureRanges
Имя пары: SummaryWords
Класс JsonArray
Класс JsonArray
представляет массив элементов JSON. Большинство методов и свойств этого класса унаследовано от JsonNode
, поэтому повторять их не имеет смысла. Стоит лишь отметить, что с помощью этого класса можно перебирать элементы массива JSON или записывать массив Json в объекты.
Класс JsonValue
Класс JsonValue
представляет какое-либо определенное значение в JSON и может использоваться для чтения/записи значений. Из основных методов у JsonValue
стоит отметить метод Create()
с помощью которого можно создавать различные значения в объекте JSON: строки, числа, булевы значения и т.д.
Итого
Сегодня мы рассмотрели основные классы для работы с JSON Node в .NET 6. JSON Node позволяет работать с json как с DOM и получать произвольный доступ к различным элементам JSON, а также записывать JSON-объекты. В большинстве случаев, при работе с JSON нам требуется сериализовать/десериализовать различные объекты и для этих целей мы всё также можем использовать уже известный нам JsonSerializer, однако, в некоторых случаях JSON DOM также оказывается востребован, например, для чтения/записи отдельных элементов Json или для работы с небольшими объектами.