Мне нужно получить значение из динамичного 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;
}
}
}
}
Комментариев нет:
Отправить комментарий