如何使用LINQ查询此JSON字符串?

时间:2015-01-11 20:39:45

标签: json linq properties nested json.net

我对LINQ很新,并且在查询JSON有效负载时做了一些SO搜索,但没有发现任何我需要的东西。下面是我的JSON。我正在使用.NET和Newtonsoft库。查询的要求是:

1)有多少LogResults的“频率”值为“低”? (在这种情况下,1)

2)如果正好有1个具有“Frequency”=“Low”的LogResult,则选择展平对象中的所有属性(ID,FName,LName,Frequency,LowRange,HighRange,Temp,Wind)

是否可以在1个查询中回答这些问题? 以下是LogResults数组中包含2个条目的示例JSON。该数组将始终包含至少1个条目,并且可能包含更多条目。

{  
    "LogResults":[  
        {  
             "ID":300,
             "FName":"Jim",
             "LName":"Smith",
             "Stats":{  
                 "Frequency":"Low",
                 "LowRange":"1",
                 "HighRange":"100",
                 "Parameters":{  
                     "Temp":"32",
                     "Wind":"5"
                 }
             }
         },
         {
             "ID":400,
             "FName":"John",
             "LName":"Warren",
             "Stats":{  
                 "Frequency":"Medium",
                 "LowRange":"1",
                 "HighRange":"100",
                 "Parameters":{  
                     "Temp":"21",
                     "Wind":"15"
                 }
             }
         }
     ]
 }

1 个答案:

答案 0 :(得分:3)

如果您可以使用json.net,可以使用linq查询json:

// Parse json first.
JObject o = JObject.Parse(json);   
  

1)有多少LogResults有统计数据"频率"价值"低"? (在这种情况下,1)

var result1 = 
    o["LogResults"]
    .Where(t => t["Stats"].Value<string>("Frequency") == "Low")
    .ToList();
  

2)如果恰好有1个LogResult与&#34;频率&#34; =&#34;低&#34;,选择展平对象中的所有属性(ID,FName,LName,Frequency,LowRange,HighRange,Temp,Wind)

if (result1.Count == 1)
{
    var result2 = result1.Select(t => new
    {
        ID = t.Value<string>("ID"),
        FName = t.Value<string>("FName"),
        LName = t.Value<string>("LName"),
        Frequency = t["Stats"].Value<string>("Frequency"),
        LowRange = t["Stats"].Value<string>("LowRange"),
        HighRange = t["Stats"].Value<string>("HighRange"),
        Temp = t["Stats"]["Parameters"].Value<string>("Temp"),
        Wind = t["Stats"]["Parameters"].Value<string>("Wind")
    }).ToList();
}

其他示例以及如何以声明方式创建json,您可以在其LINQ to JSON文档中找到它。