首页 > 解决方案 > 尝试从 Json 对象 C# 中提取值时出错

问题描述

我有一个像下面这样的 Json 字符串,这只是一个小片段。引号中的数字是一个 Unix 时间,我需要用它来迭代每个对象。

{
  "result": {
    "1534860000": [
      "1534860000",
      19,
      41
    ],
    "1534863600": [
      "1534863600",
      11,
      16
    ],
    "1534867200": [
      "1534867200",
      2,
      5
    ]
  }
}

但是当我尝试提取数组中的数据时,出现错误:

System.InvalidOperationException:“无法访问 Newtonsoft.Json.Linq.JProperty 上的子值。”

代码:

JObject jsonObj = JObject.Parse(response);

string unixTime = Helpers.ConvertToUnix(yesterday.AddHours(hour)).ToString();

foreach (var obj in jsonObj["result"])
{      
    var array = obj[unixTime]; //here is where the error occurs
}

任何人都能够阐明我所缺少的东西吗?

标签: c#jsonobjectjson.net

解决方案


如果我们稍微简化您的示例代码以删除该unixTime元素(让我们暂时对其进行硬编码),我们将得到以下结果:

JObject jsonObj = JObject.Parse(response);
string unixTime = "1534860000";

在这个阶段,我们有jsonObjwhich 引用 JSON 对象的根,并且具有result. 在此处重复您foreach的上下文:

foreach (var obj in jsonObj["result"])
{
    var array = obj[unixTime]; //here is where the error occurs
}

您最终obj会引用 .json 的 JSON 路径result.1534860000问题是您正在此JSON 路径 ( )1534860000处寻找不存在的属性。result.1534860000.1534860000

您可以直接获取值,如下所示:

var array = obj["result"][unixTime]

当然,这需要一些错误检查以确保路径存在等,但它证明了这一点。


推荐阅读