使用LINQ查询JSON

我有一个从API调用收到的Json响应。 它有几个嵌套级别,如下所示(这是一个片段):

"Items": [ { "Result": { "Id": "191e24b8-887d-e111-96ec-000c29128cee", "Name": "Name", "StartDate": "2012-04-03T00:00:00+01:00", "EndDate": null, "Status": { "Name": "Active", "Value": 5 }, "Client": { "Id": "35ea10da-b8d5-4ef8-bf23-c829ae90fe60", "Name": "client Name", "AdditionalItems": {} }, "ServiceAgreement": { "Id": "65216699-a409-44b0-8294-0e995eb05d9d", "Name": "Name", "AdditionalItems": { "ScheduleBased": true, "PayFrequency": { "Id": "981acb72-8291-de11-98fa-005056c00008", "Name": "Weekly", "AdditionalItems": {} }, "PayCycle": [ { "Name": "Schedule Based", "ScheduleBased": true, "SelfBilling": false, "Id": "a8a2ecc4-ff79-46da-a135-743b57808ec3", "CreatedOn": "2011-09-16T23:32:19+01:00", "CreatedBy": "System Administrator", "ModifiedOn": "2011-09-16T23:32:19+01:00", "ModifiedBy": "System Administrator", "Archived": false } ] } }, } ] ... 

我想要做的是使用Linq从PayCycle节点中检索数据。 我可以使用Result.ServiceAgreement.AdditionalItems.SchedultedBased在Controller中使用以下Linq获取值为true的项:

 var result = from p in data["Data"]["Items"].Children() where (bool)p["Result"]["ServiceAgreement"]["AdditionalItems"]["ScheduleBased"] == true select new { Name = (string)p["Result"]["Client"]["Name"], Id = (string)p["Result"]["Client"]["Id"] }; 

现在我需要获取Result.ServiceAgreement.AdditionalItems.Paycycle.ScheduleBasedSelfBilling属性。 如果PayCycle也是一个数组,我该如何做到这一点,我如何获得子项,就像我在Linq上面的Data.Items那样,以便我可以在这两个项目上使用where子句filter?

您可以将JSON反序列化为dynamic对象,然后将Linq用于对象:

  [TestMethod] public void TestMethod1() { const string json = @"""Items"": [ { ""Result"": { ""Id"": ""191e24b8-887d-e111-96ec-000c29128cee"", ""Name"": ""Name"", ""StartDate"": ""2012-04-03T00:00:00+01:00"", ""EndDate"": null, ""Status"": { ""Name"": ""Active"", ""Value"": 5 }, ""Client"": { ""Id"": ""35ea10da-b8d5-4ef8-bf23-c829ae90fe60"", ""Name"": ""client Name"", ""AdditionalItems"": {} }, ""ServiceAgreement"": { ""Id"": ""65216699-a409-44b0-8294-0e995eb05d9d"", ""Name"": ""Name"", ""AdditionalItems"": { ""ScheduleBased"": true, ""PayFrequency"": { ""Id"": ""981acb72-8291-de11-98fa-005056c00008"", ""Name"": ""Weekly"", ""AdditionalItems"": {} }, ""PayCycle"": [ { ""Name"": ""Schedule Based"", ""ScheduleBased"": true, ""SelfBilling"": false, ""Id"": ""a8a2ecc4-ff79-46da-a135-743b57808ec3"", ""CreatedOn"": ""2011-09-16T23:32:19+01:00"", ""CreatedBy"": ""System Administrator"", ""ModifiedOn"": ""2011-09-16T23:32:19+01:00"", ""ModifiedBy"": ""System Administrator"", ""Archived"": false } ] } } } } ]"; dynamic data = System.Web.Helpers.Json.Decode("{" + json + "}"); var result = from i in (IEnumerable)data.Items where i.Result.ServiceAgreement.AdditionalItems.ScheduleBased == true select new { i.Result.Client.Name, i.Result.Client.Id }; Assert.AreEqual(1, result.Count()); Assert.AreEqual("client Name", result.First().Name); Assert.AreEqual("35ea10da-b8d5-4ef8-bf23-c829ae90fe60", result.First().Id); } 

请注意,我必须在示例json字符串周围添加括号{和},否则.NET json解析器不喜欢它。

首先,我不熟悉使用这种格式[“some”] [“thing”]编写LINQ / LAMBDA。 我的第一步是创建一些类/对象来容纳数据,以便以后创建任何代码。

例如

 public class Result { public Guid Id { get; set; } public string Name { get; set; }, public DateTime StartDate { get; set; } //you get the idea } 

但可能尝试以下?

  var result = from p in data["Data"]["Items"].Children() where (bool)p["Result"]["ServiceAgreement"]["AdditionalItems"]["ScheduleBased"] == true && (p["Result"]["ServiceAgreement"]["AdditionalItems"]["PayCycle"]).Where(o => o.["ScheduleBased"] == true) select new { Name = (string)p["Result"]["Client"]["Name"], Id = (string)p["Result"]["Client"]["Id"] };