#c_sharp
Мне нужно получить значение из динамичного JSON. Он огромен , поэтому приводить его полностью не имеет смысла. Меня интересует значения тиража, как мне туда добраться максимально изящно? По логике мне надо найти слово Тираж в строке и перейти в соседнюю ячейку и получить значение.
Ответы
Ответ 1
Воспользуйтесь готовыми парсерами. Читать 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; } } } }Ответ 2
Решил проблему следующим образом. JObject json_obj = JObject.Parse(json_data); JArray capabilities = (JArray)json_obj["Capabilities"]["Capabilities"]; var сirculation = capabilities.Where(c => (string)c["Name"] == "Тираж").Select(c => c["Value"]).FirstOrDefault();
Комментариев нет:
Отправить комментарий