Страницы

Поиск по вопросам

вторник, 29 января 2019 г.

Поиск в JSON строке значения

Мне нужно получить значение из динамичного JSON. Он огромен , поэтому приводить его полностью не имеет смысла. Меня интересует значения тиража, как мне туда добраться максимально изящно?
По логике мне надо найти слово Тираж в строке и перейти в соседнюю ячейку и получить значение.


Ответ

Воспользуйтесь готовыми парсерами. Читать JSON поиском или регулярными выражениями - не очень хорошая идея. Например, свойство Value не обязано идти до свойства Name, оно может идти и после него. Смысл JSON при этом не изменится, а отловить все такие случаи при поиске будет тяжело.
Json.NET поддерживает такую вещь, как запросы JSONPath
var json = @"{ ""Editions"": {}, ""ItemType"": 5, ""Capabilities"": { ""Capabilities"": [ { ""Name"": ""Тираж"", ""Value"": ""20000"", ""AdditionalProperties"": {} }, { ""Name"": ""aaaa"", ""Value"": ""bbb"", ""AdditionalProperties"": {} } ] } }";
var obj = JObject.Parse(json); var value = (string)obj.SelectToken("$.Capabilities.Capabilities[?(@.Name == 'Тираж')].Value");
Если JSON действительно огромный и десериализовать целиком его накладно по памяти, то придется воспользоваться JsonTextReader, десереализуя только небольшие части файла (код приблизительный, без проверок):
string value = null; using (var reader = new JsonTextReader(new StringReader(json))) { // читаем json, пока не придем в объект Capabilities while (reader.Read()) { if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "Capabilities") { break; } }
reader.Read();
// каждый объект из массива десериализуем в JObject while (reader.Read()) { if (reader.TokenType == JsonToken.StartObject) { var obj = JObject.Load(reader); if ((string)obj["Name"] == "Тираж") { value = (string)obj["Value"]; break; } } } }

Комментариев нет:

Отправить комментарий