我对C#有点新,并且在解析一些嵌套的JSON对象时遇到了一些麻烦。
我正在发出一个返回一些JSON的GET请求。我尽可能简化了它,以便轻松过去。 JSON响应的一个示例是:
{
"response": {
"ITEM1": {
"RANDOM_DATE": {
"mean": 150,
"min": 150,
"max": 150
}
},
"ITEM2": {
"RANDOM_DATE2": {
"mean": 200,
"min": 200,
"max": 200
},
"RANDOM_DATE3": {
"mean": 150,
"min": 150,
"max": 150
}
}
}
}
我目前拥有的是:
dynamic response = JObject.Parse(await client.DownloadStringTaskAsync(url));
foreach (dynamic item in response["response"])
{
string name = item.ToString();
string valueInCentsStr = "0";
int valueInCents = 0;
foreach (dynamic day in response["response"][item])
{
valueString = response["response"][item][day].min;
valueInt = int.Parse(valueString);
}
}
所以现在item.ToString()完全没问题。它正常运行并返回ITEM1和ITEM2。
问题是,嵌套对象名称总是不同的,这就是为什么我添加了一个嵌套的foreach来遍历每个ITEM以从每天获取数据的原因。然而,这似乎并没有起作用。我得到一个错误指向那个foreach说:
System.AggregateException: One or more errors occurred. ---> System.ArgumentException: Accessed JObject values with invalid key value:
我更习惯于JavaScript,这在JS中运行良好。您将如何改变这一点以便能够从嵌套对象中获取信息?
感谢。
答案 0 :(得分:0)
由于您已经在使用Json.NET,因此反序列化JSON的最简单方法是定义以下类型:
public class RootObject
{
public Dictionary<string, Dictionary<string, DateValue>> response { get; set; }
}
public class DateValue
{
public int mean { get; set; }
public int min { get; set; }
public int max { get; set; }
}
(如果在您的实际JSON中这些值,您可能需要将mean
,min
和max
更改为decimal
或double
类型可以是分数。)
然后按如下方式反序列化:
var root = JsonConvert.DeserializeObject<RootObject>(response);
相关文档:Deserialize a Dictionary。
示例fiddle。
请注意,如果您的"RANDOM_DATE"
字符串实际上是Json.NET识别的DateTime
格式(请参阅here以获取此类格式的列表),您可以定义{{1}如下:
RootObject