使用SelectTokens查询JSON

时间:2017-10-12 04:45:26

标签: c# json json.net

我想查询JArray并根据某些条件获取另一个JArray。现在使用LINQ我可以先查询它,返回IEnumerable<JToken>并将其转换为另一个JArray,如下所示:

IEnumerable<JToken> ienmTotalObjects = arrResults.Where(x => x["uResultId"]?.ToString() == arrTaskResults[intResult]["uResultId"].ToString() && x["iElementId"]?.ToString() == strUniqueElementId);
JArray arrTotalObjects = new JArray(ienmTotalObject);

现在我刚刚了解了JSON.NET SelectTokenshttps://www.newtonsoft.com/json/help/html/SelectToken.htm)并且看起来像是一个非常方便的功能,无需转换为IEnumerable即可查询,但是我无法找到方法在我的案例场景中应用它。好奇,如果它真的可能吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

从问题我可以猜到arrResultsarrTaskResults

的2个结构
var arrResults = JArray.Parse(@"[
{ iElementId: 1, ""uResultId"" :""aa"" },
{ iElementId: 2, ""uResultId"" :""bb"" }
]");

var arrTaskResults = JArray.Parse(@"[
{ ""uResultId"" :""aa"" },
{ ""uResultId"" :""bb"" }
]");

但是,我不知道intResultstrUniqueElementId是什么,所以这些都设置在这里

var intResult = 0;
var strUniqueElementId = "1";

我们现在可以执行相同的查询,但使用传入JPath的SelectToken方法:

var s = arrTaskResults.SelectToken($"$[{intResult}].uResultId");

var selectTokens = arrResults.SelectTokens($"$[?(@.uResultId=='{s}' && @.iElementId=={strUniqueElementId})]");

执行此操作将输出以下内容:

[
  {
    "iElementId": 1,
    "uResultId": "aa"
  }
]