Я получаю доступ к данным из вызова API в формате JSON. Я пытаюсь поместить его в dict, чтобы я мог получить доступ к данным. Это идеально работает для простых объектов JSON, но не работает для вложенных объектов с «Неожиданный символ, обнаруженный при синтаксическом анализе значения: [. Путь 'cluster_functions', строка 1, позиция 539».
Мой JSON:
{
"id": "xxxxx",
"uuid": "xxxxx",
"cluster_incarnation_id": 151013752,
"cluster_functions": ["NDFS"],
"is_lts": true,
"num_nodes": 4,
"block_serials": ["17xxx"],
"ntp_servers": ["172.26.140.50", "ntp.xxx.be"],
"service_centers": [],
"http_proxies": [],
"rackable_units": [{
"id": 23,
"rackable_unit_uuid": "09f211d1-8fb4-xxxx-86e2-ce819xxxx29",
"positions": ["1", "2", "3", "4"],
"nodes": [6, 7, 8, 9]
}],
"public_keys": [],
"smtp_server": null,
"hypervisor_types": ["kKvm"],
"cluster_redundancy_state": {
"current_redundancy_factor": 2,
"desired_redundancy_factor": 2,
"redundancy_status": {
"kCassandraPrepareDone": true,
"kZookeeperPrepareDone": true
}
}
}
Код:
using (StreamReader reader = new StreamReader(HttpResponseStream))
{
//Response.Code = 1;
string body = reader.ReadToEnd();
consoleoutput("REST: result" + body);
resultdict = JsonConvert.DeserializeObject<Dictionary<string, string>>(body);
}
Я не знаю, как продолжить. Должен ли я анализировать строку за строкой и выполнять другую десериализацию, если значение не является строкой? Но как мне это сделать, если я заранее не знаю формат JSON (и, следовательно, количество уровней).
Или есть более эффективный способ анализа диктовки независимо от количества слоев?
Спасибо
В идеале вы должны определить класс со всеми этими свойствами, но если вам нужно/хотите придерживаться словаря, вам нужно TValue, которое может содержать все возможности, а строка - нет.
Вы также можете просто сделать JsonConvert.DeserializeObject<dynamic>(...
Если ответ стабилен, вам нужно десериализоваться в какой-то класс
Пытаться:
using (StreamReader reader = new StreamReader(HttpResponseStream))
{
//Response.Code = 1;
string body = reader.ReadToEnd();
consoleoutput("REST: result" + body);
resultdict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(body);
}
В любом случае не стоит так подходить.
Вы должны создать класс, описывающий все возможные свойства, и работать следующим образом:
public class Entity { /* properties definitions... */ }
А потом
using (StreamReader reader = new StreamReader(HttpResponseStream))
{
//Response.Code = 1;
string body = reader.ReadToEnd();
consoleoutput("REST: result" + body);
List<Entity> entities = JsonConvert.DeserializeObject<Entity>(body).ToList();
}
Спасибо! Я не знаю, как работать с определениями свойств, но попытаюсь вникнуть в это сам. Тем временем я использую "строковое, динамическое" решение. Однако тогда я не могу получить доступ к этим вложенным объектам. Должен ли я быть в состоянии преодолеть это с помощью определений свойств? Спасибо!
Вы можете напрямую обращаться к вложенным объектам, даже если IDE не предлагает вам их имена, отметьте ответ как принятый, если я вам помог!
Не каждое значение этих свойств json является строкой, поэтому вы не можете десериализовать этот json в словарь строк->строк, вместо этого попробуйте
Dictionary<string, JToken>
.