在 C# 中解析不带对象名称的 JSON

  • 本文关键字:对象 JSON c# json json.net
  • 更新时间 :
  • 英文 :


我对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);
    }
}

所以现在的项目。ToString() 是完全没问题的。它正常工作并返回 ITEM1 和 ITEM2。

问题是,嵌套的对象名称总是不同的,这就是为什么我添加一个嵌套的foreach来迭代每个ITEM以从每天获取数据。然而,这似乎不起作用。我得到一个错误,指向那个foreach说:

System.AggregateException: One or more errors occurred. ---> System.ArgumentException: Accessed JObject values with invalid key value:

我更习惯于JavaScript,这在JS中工作得很好。您将如何改变它以便能够从嵌套对象中获取信息?

谢谢。

由于您已经在使用 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; }
}

(您可能需要将meanminmax更改为类型 decimaldouble,如果在实际 JSON 中这些值可以是小数。

然后按如下方式反序列化:

var root = JsonConvert.DeserializeObject<RootObject>(response);

相关文档:反序列化字典。

样品小提琴。

请注意,如果您的"RANDOM_DATE"字符串实际上是 Json.NET 识别的DateTime格式(有关此类格式的列表,请参阅此处),则可以按如下方式定义RootObject

public class RootObject
{
    public Dictionary<string, Dictionary<DateTime, DateValue>> response { get; set; }
}

相关内容

  • 没有找到相关文章

最新更新