Я новичок в Json, и я пытаюсь разобрать следующий пример от одного поставщика:
{
"Nodes": [ "ID1", "ID2", "ID3", "IDxx" ],
"Results": {
"ID1": {
"ID2": {
"value1": "example1",
"value2": "exempleHexa"
},
"ID3": {
"value1": "example2",
"value2": "exempleHexa"
}
},
"ID3": {
"ID1": {
"value1": "example3",
"value2": "exempleHexa"
},
"ID2": {
"value1": "example4",
"value2": "exempleHexa"
},
"ID3": {
"value1": "example5",
"value2": "exempleHexa"
}
}
}
}
Я пробовал эту строку для доступа к Value1, но она всегда возвращает null:
var json = JsonConvert.DeserializeObject<dynamic>(JsonData);
var data = ((JObject)json.Results).Children().ToArray();
foreach (var item in data)
{
var childss = item.Children().ToArray();
foreach (var item2 in childss)
{
var sub = JsonConvert.DeserializeObject<dynamic>(item2.ToString());
string hmm = sub.value1;
}
}
у кого-нибудь есть идея? Благодарю.





Попробуй это:
public class ID2
{
public string value1 { get; set; }
public string value2 { get; set; }
}
public class ID3
{
public string value1 { get; set; }
public string value2 { get; set; }
}
public class ID1
{
public ID2 ID2 { get; set; }
public ID3 ID3 { get; set; }
}
public class ID12
{
public string value1 { get; set; }
public string value2 { get; set; }
}
public class ID22
{
public string value1 { get; set; }
public string value2 { get; set; }
}
public class ID33
{
public string value1 { get; set; }
public string value2 { get; set; }
}
public class ID32
{
public ID12 ID1 { get; set; }
public ID22 ID2 { get; set; }
public ID33 ID3 { get; set; }
}
public class Results
{
public ID1 ID1 { get; set; }
public ID32 ID3 { get; set; }
}
public class RootObject
{
public List<string> Nodes { get; set; }
public Results Results { get; set; }
}
А потом примерно так:
var data = JsonConvert.DeserializeObject<RootObject>(JsonData);
Вы получите все в корневом объекте.
Объекты JObject уже являются динамическими и десериализованными, поэтому вам не нужно повторно сериализовать их и снова десериализовать.
В вашей структуре ввода есть еще один слой объектов, который вы, кажется, пропускаете. Например, если вам нужно значение value1 из Results.ID1.ID2, вам нужно копнуть немного глубже:
var json = JsonConvert.DeserializeObject<dynamic>(JsonData);
var data = ((JObject)json.Results).Properties().Values().Cast<JObject>().ToArray();
foreach (var item in data)
{
var childss = item.Properties().Values().ToArray();
foreach (dynamic item2 in childss)
{
string hmm = item2.value1;
Console.WriteLine(hmm);
}
}
Тем не менее, вы можете значительно очистить синтаксис:
var json = JsonConvert.DeserializeObject<JObject>(JsonData);
List<string> value1s = json.SelectTokens("Results.*.*.value1").Values()
.Select(t => t.ToString())
.ToList();
Children всегда будет возвращать дочерние элементы корневого объекта. Вам нужно использовать свойство Value, а затем запросить его дочерние элементы. Этот код должен работать:
var data = ((JObject)json.Results).Children().ToArray();
foreach (JProperty item in data)
{
var childss = item.Value.Children().ToArray();
foreach (JProperty item2 in childss)
{
dynamic sub = item2.Value;
string hmm = sub.value1;
}
}
Большое спасибо, это именно то, что я искал.
Вы пытаетесь сделать что-то подобное?
string test = "{ \"Nodes\": [ \"ID1\", \"ID2\", \"ID3\", \"IDxx\" ], \"Results\": { \"ID1\": { \"ID2\": { \"value1\": \"example1\", \"value2\": \"exempleHexa\" }, \"ID3\": { \"value1\": \"example2\", \"value2\": \"exempleHexa\" } }, \"ID3\": { \"ID1\": { \"value1\": \"example3\", \"value2\": \"exempleHexa\" }, \"ID2\": { \"value1\": \"example4\", \"value2\": \"exempleHexa\" }, \"ID3\": { \"value1\": \"example5\", \"value2\": \"exempleHexa\" } } } }";
dynamic obj = JsonConvert.DeserializeObject(test);
Console.WriteLine("test output" + obj.Nodes[0]);
Просто получите доступ к данным, передав индекс массива, в котором они находятся, например, obj.Nodes[0] и так далее.
Я забыл упомянуть, что имена переменных IDxx - это динамика.