[英]Count and select values of of a JArray with json.net
我有一个C#中生成的json数组,来自:
var jArray = JArray.Parse(json);
如下所示:
{[
{
"tbxSocialContents_3": "test"
},
{
"txtSocialContentsImage_3": "C:\\fakepath\\photo.jpg"
},
{
"txtSocialContentsImageValue_3": "photo.jpg"
}
]}
我需要知道数组中有多少个元素具有一个包含文本txtSocialContentsImage
的属性,如果result is > 1
选择属性txtSocialContentsImageValue_3
的值。
我该如何在C#中执行此操作?
发送字典作为键值对数组的方法很奇怪,但是嘿,我要判断谁。
首先,您发布的JSON不是数组,您将得到Newtonsoft.Json.JsonReaderException: Error reading JArray from JsonReader. Current JsonReader item is not an array: StartObject
Newtonsoft.Json.JsonReaderException: Error reading JArray from JsonReader. Current JsonReader item is not an array: StartObject
尝试读取该原始JSON的Newtonsoft.Json.JsonReaderException: Error reading JArray from JsonReader. Current JsonReader item is not an array: StartObject
异常。 因此,我们假设您确实拥有正确的JSON并删除了前导和尾随的花样。
这应该工作:
var jArray = JArray.Parse(json);
var matchedElements = jArray.Cast<JObject>().ToDictionary(item => item.Properties().FirstOrDefault().Name, item => item.Properties().FirstOrDefault().Value.Value<string>());
if (matchedElements.Where(kv => kv.Key.Contains("txtSocialContentsImage")).Count() > 1
&& matchedElements.Any(x => x.Key == "txtSocialContentsImageValue_3"))
{
return matchedElements["txtSocialContentsImageValue_3"];
}
您应该能够使用LINQ来完成此任务:
string json = @"[{""tbxSocialContents_3"": ""test""},{""txtSocialContentsImage_3"": ""C:\\fakepath\\photo.jpg""},{""txtSocialContentsImageValue_3"": ""photo.jpg"",""txtSocialContentsImageValue_4"": ""photo2.jpg""}]";
JArray arr = JArray.Parse(json);
var testVal = from a in arr
let sum = a.Children<JProperty>().Count(x => x.Name.Contains("txtSocialContentsImage"))
let names = a.Children<JProperty>().Where(x => x.Name.Contains("txtSocialContentsImage"))
.Select(x => x.Name)
select new {Count = sum, Names = sum > 1 ? names : null};
它返回:
[0]:{计数= 0,名称=空}
[1]:{Count = 1,Names = null}
[2]:{Count = 2,名称= {[0]:“ txtSocialContentsImageValue_3”,[1]:“ txtSocialContentsImageValue_4”}}
现在,您可以对所有值求和以获得总计数,或者只是保持原样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.