在C#中访问JSON.NET JArray中的项

5

我的API返回

{
  "result": [
    {
      "id": "51473",
      "name": "serv-vc",
      "modifydate": "2014-10-09 18:29:48.033",
      "expirationoff": "false",
      "createdate": "",
      "scheduleoff": "false",
    }
  ],
  "status": 0
}

我已经将其存储为JObject reponseobj对象了。

我遇到了访问responseobj["result"][0]["id"]的问题。

每次尝试这样做时,都会出现数组越界的错误提示。

我错过了什么吗?

我也尝试了其他方法。

JArray resultarr = (JArray)responseobj.SelectToken("result");
resultarr[0]["id"] 

但是它们会产生相同的结果。

你确定你的结果数组总是有数据吗?如果它是空的并且你尝试访问元素0(或任何其他元素),你将会得到一个数组越界异常。 - Brian Rogers
4个回答

3
假设响应保存在名为response的字符串变量中,可以按如下方式实现:
JObject responseobj = JObject.Parse(response);
JObject result = (JObject)(responseobj.SelectToken("result") as JArray).First();
int id = result.Value<int>("id");

最佳答案。简洁明了。 - Kinyanjui Kamau

1
尝试使用:

JObject jObject = JObject.Parse( "{\"result\": [{\"id\": \"51473\", \"name\": \"serv-vc\", \"modifydate\": \"2014-10-09 18:29:48.033\", \"expirationoff\": \"false\", \"createdate\": \"\", \"scheduleoff\": \"false\", } ], \"status\": 0 }" );

要访问不同的节点,您可以使用:

string name = jObject["result"]["name"].ToString();
string expirationoff = jObject["result"]["expirationoff"].ToString();

或者你可以将 result 转换成一个新的 json 并对其进行操作

要访问 result,您可以执行以下操作:

var result = jObject["result"][0];

请记住,您的 json 中可能有 0、1、2... x 个结果,因此您需要引用第一个位置。


你缺少了数组索引。result是一个数组,而nameexpirationoff是数组内对象的属性。 - Brian Rogers

0

不确定你的问题是什么,但这对我来说似乎有效:

static void Main(string[] args)
{
    JObject j = JObject.Parse(
        "{\"result\": [{\"id\": \"51473\", \"name\": \"serv-vc\", \"modifydate\": \"2014-10-09 18:29:48.033\", \"expirationoff\": \"false\", \"createdate\": \"\", \"scheduleoff\": \"false\", } ], \"status\": 0 }" );
    var res = j["result"];
    Console.Out.WriteLine(res); 
    // show an arrays

    var maybe = j["result"][0];
    Console.Out.WriteLine(maybe);
    // shows the first object in the array

    var fail = j["result"][0]["id"];
    Console.Out.WriteLine(fail);
    // shows 51473
}

0
var Jobj = ((JObject)RequestObject)["data"];
foreach (JObject content in Jobj.Children<JObject>()) {
    foreach (JProperty prop in content.Properties()) {
        Console.WriteLine(prop.Name);//the column name
        Console.WriteLine(prop.Value.ToString());// column value
    }
}

请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Tyler2P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接