繁体   English   中英

使用json.net计算并选择JArray的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM