我有一个拥有Json数据的JObject对象。我需要收集所有"state": true
的KeyValuePairs。在我读取值之前,我想确保JObject至少有一个带有JToken(Value)的KeyValuePairs具有"state": true
。
以下是我的JSON:
{
"AAA": {
"state": false,
"version": "1.1.14202.0",
"result": null,
"update": "20171018"
},
"BBB": {
"state": true,
"version": "3.10.1.18987",
"result": null,
"update": "20171018"
},
"CCC": {
"state": true,
"version": "1.1.1.2",
"result": null,
"update": "20171018"
}
}
以下是我正在检查的代码,这是一个例外Cannot access child value on Newtonsoft.Json.Linq.JProperty
:
JObject jsonData = //JSON data;
List<JToken> tokens = jsonData .Children().ToList();
if (tokens.Any(each => each["state"].ToString().ToLower().Contains("true")))
{
List<JToken> tokensWithStateTrue = tokens.Where(each => each["state"].ToString().ToLower().Contains("true")).ToList();
}
请帮助我并更正LinQ语句,将状态的JTokens只读为 true 。
答案 0 :(得分:2)
这对我有用,看起来你错过了对Children()的额外调用来访问你需要的属性。
//parse JSON and grab it's children.
var jsonData = JObject.Parse(json).Children();
List<JToken> tokens = jsonData .Children().ToList();
或
List<JToken> tokens = jsonData .Children().Children().ToList();
if (tokens.Any(each => each["state"].ToString().ToLower().Contains("true")))
{
List<JToken> tokensWithStateTrue = tokens.Where(each => each["state"].ToString().ToLower().Contains("true")).ToList();
}
或者你可以这样做。下面的代码将返回一个只包含具有真值的状态的字典。否则,如果没有真值,它将返回一个空字典。
var dictionaryTokensWithTrueValues = jsonData.Children()
.Select(u => u as JProperty)
.Where(v => v.Value["state"].ToString().ToLower().Contains("true"))
.ToDictionary(k => k.Name, v => v.Value);
//check if you have any true values
if (dictionaryTokensWithTrueValues.Count() > 0)
{
//do something with true states here
var accessBBB = dictionaryTokensWithTrueValues["BBB"]; //{{"state": true,"version": "3.10.1.18987","result": null,"update": "20171018"}}
}
else
{
//no true states. Do something else
}