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

时间:2017-11-06 23:44:07

标签: c# linq 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#中做到这一点?

2 个答案:

答案 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”}}

现在,您可以将所有值相加以获得总计数,或者只是将它们保持原样。