我在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#中做到这一点?
答案 0 :(得分:0)
将字典作为一组键值对发送的奇怪方法,但是嘿,我该判断谁。
首先,您发布的JSON不是数组,尝试读取原始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"];
}
答案 1 :(得分:0)
您应该可以使用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]:{Count = 0,Names = null}
[1]:{Count = 1,Names = null}
[2]:{Count = 2,Names = {[0]:“txtSocialContentsImageValue_3”,[1]:“txtSocialContentsImageValue_4”}}
现在,您可以将所有值相加以获得总计数,或者只是将它们保持原样。