使用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.ScheduleBased
和SelfBilling
属性。 如果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"] };