C# JToken上的LINQ where查询
我不熟悉LINQ查询,我想从C# JToken上的LINQ where查询,c#,json,linq,json.net,where,C#,Json,Linq,Json.net,Where,我不熟悉LINQ查询,我想从JToken中获取1个项目(id=0的项目),但我不知道该如何工作 我尝试了很多不同的方法,但这是我首先尝试的代码: var statId0 = from stat in objectRankedStats where (int)stat["id"] == 0 select stat; 我有一个错误: 找不到源类型“Newtonsoft.Json.Linq.JToken”的查询模式的实现找不到的地方。“System.Linq”是否缺少引用或using指令 这看起来像
JToken
中获取1个项目(id=0的项目),但我不知道该如何工作
我尝试了很多不同的方法,但这是我首先尝试的代码:
var statId0 = from stat in objectRankedStats where (int)stat["id"] == 0 select stat;
我有一个错误:
找不到源类型“Newtonsoft.Json.Linq.JToken”的查询模式的实现找不到的地方。“System.Linq”是否缺少引用或using指令
这看起来像是objectRankedStats
:
{[ {
"id": 40,
"stats":
{
"totalSessionsPlayed": 10,
"totalSessionsLost": 8,
"totalSessionsWon": 2,
}
},
{
"id": 6,
"stats":
{
"totalSessionsPlayed": 3,
"totalSessionsLost": 2,
"totalSessionsWon": 1,
}
}
]}
我不明白“引号”是如何处理退格的
我像这样声明objectRankedStats,并在代码中的其他地方使用它,它可以工作
var objectRankedStats = JObject.Parse(output)["champions"];
这就是为什么我认为它是空的:
我对我在dotnetFiddle.com上使用的代码做了一个简化版本:此代码适合我:
正如错误所说,您是否已使用System.Linq代码>在标题处了吗?这不是有效的JSON。您的意思是要包含数组的名称吗?还是外部的
{
和}
有错误?@tia:噢,该死!我习惯了典型的错误消息“找不到类型或名称空间”,所以我没有想到它。缺少using,但现在它返回null(或者我只是为了访问信息而装傻)。@Andrew Whitaker:这个JSON是有效的,因为它来自一个官方API,但我“硬编码”了JSON文件的这一部分,它太大了,数组的名称是“冠军”。但谢谢你们的评论。它不应该返回空值。它返回空列表还是包含单个空项的列表?你是如何检查它是否为空的?这工作得很好!您能简单地解释一下objectRankedStats中var statId0=from stat之间的区别吗?其中(int)stat[“id”]==0 select stat;和var champ=objectRankedStats.FirstOrDefault(jt=>(int)jt[“id”]==6);请?您的statId0是IEnumerable对象。简而言之,IEnumerable是集合、序列的接口。使用FirstOrDefault时,从序列中提取第一项(或空值,序列的值为空)。
using System;
using System.Linq;
using Newtonsoft.Json.Linq;
namespace ConsoleApplication1
{
static class Program
{
static void Main()
{
try
{
const string output = @"{""champions"": [ {
""id"": 40,
""stats"":
{
""totalSessionsPlayed"": 10,
""totalSessionsLost"": 8,
""totalSessionsWon"": 2,
}
},
{
""id"": 6,
""stats"":
{
""totalSessionsPlayed"": 3,
""totalSessionsLost"": 2,
""totalSessionsWon"": 1,
}
}
]}";
var objectRankedStats = JObject.Parse(output)["champions"];
var champ = objectRankedStats.FirstOrDefault(jt => (int)jt["id"] == 6);
Console.WriteLine(champ);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}