我有一个在 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 不是一个数组,尝试读取该原始 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]: {计数 = 1, 名称 = 空 }
[2]: {计数 = 2, 名称 = {[0]: "txtSocialContentsImageValue_3", [1]: "txtSocialContentsImageValue_4"}}
现在,您可以将所有值相加以获得总数,或者只是保持原样。