计算并选择带有 json.net 的 JArray 的值



我有一个在 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"}}

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

相关内容

  • 没有找到相关文章

最新更新