无法转换" int"到" System.Func< Newtonsoft.Json.Linq.Jtoken,布尔>

时间:2017-03-15 14:36:54

标签: c# json

我在C#JToken中使用.Count Methode时遇到问题。谁知道我做错了什么?

我在这一行收到错误:

JToken lastid = (int)IDObject["data"].Count(-1)["q_id"];



Argument "2": Can not convert "int" to "System.Func
<
Newtonsoft.Json.Linq.Jtoken,bool>"

修改

好的,我有一个json格式的567个ID。有.First,我可以得到Id = 1,现在我想得到最后一个Id,在这种情况下,它是id = 567

2 个答案:

答案 0 :(得分:0)

您想要在列表底部返回令牌的ID。

.Count()的使用不正确,请参阅thisthis。函数本身将返回列表中元素的总和。或者,您可以传递一个函数,该函数将返回列表中满足要求的所有元素的计数。你收到的错误是因为Count(-1)期望一个函数,但是得到一个int。

现在检索列表中最后一个标记的ID。您只需使用

调用列表的最后一项即可
int id = IDObject["data"].Last()["q_id"];

.Last()将调用列表中的最后一项。

有关列表及其导航方式的其他信息,建议您查看APIthis方便的网站

编辑:

你很可能是JSON就像

{ "data":[{
       "question1", 
       "question2", 
       "question3"
       }]
}

调用IDOBject [“data”]将这些问题转换为

{
   "q_id", 
   "q_text", 
   "q_something_else", 
   "q_id", 
   "q_text", 
   "ect.."
}

未来的建议是通过附加标记省略您发送的数据。像

这样的东西
{"data": 
    **question**:[
     {
        "q_id", 
        "q_text", 
        "q_something_else"
     },{
        "q_id", 
        "q_text", 
        "q_something_else"
     }]
 };

这有助于将您的问题与彼此隔离开来。 但这只是一个建议,因为我相信你的当前问题有一个解决方案。

int id = IDObject["data"].Where(tag => tag.Equals("q_id")).Last()["q_id"];

除了“q_id”标记之外,where将过滤掉所有标记。假设thr 567是最后一个q_id,。Last()将选择此标记。

编辑2:

实际上,您甚至可以通过简单地获取所需的相关标签来缩短它,567。

int id = IDObject["data"].Where(tag => tag["q_id"] == 567);

或在字符串

的情况下
int id = IDObject["data"].Where(tag => tag["q_id"].Equals("567"));

答案 1 :(得分:-1)

我认为不可能将Count方法作为参数传递给int。此时错误可能会被抛出,因为在尝试执行以下代码时会出现类似的错误:

new List<int>().Count(-1);
//Argument type 'int' is not assignable to parameter type 'System.Func<int,bool>'

也许你可以通过澄清你究竟想要做什么来帮助。