Query JSON using LINQ

前端 未结 2 509
自闭症患者
自闭症患者 2021-02-15 12:03

I have a Json response that I receive from an API call. It has several nested levels as show below (this is a snippet):

\"Items\": [
  {
    \"Result\": {
               


        
相关标签:
2条回答
  • 2021-02-15 12:34

    To start off, I'm not familiar with writing LINQ/LAMBDA using this format ["some"]["thing"]. My first step would be to create some classes/objects to house the data in to ease creating any code afterwards.

    e.g.

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

    But possibly try the following?

        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"]
                     };
    
    0 讨论(0)
  • 2021-02-15 12:52

    You can deserialize the JSON into a dynamic object, and then use Linq to Objects:

        [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<dynamic>)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);
        }
    

    Note that I had to add brackets { and } around your example json string, or else the .NET json parser doesn't like it.

    0 讨论(0)
提交回复
热议问题