2012-09-17 14 views
8

私はAPIコールから受け取ったJson応答を持っています。それは(これは抜粋です)以下のショーとして、いくつかのネストされたレベルがあります。私は何をしたいかLINQを使用した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のを使用してペイサイクル・ノードからデータを盗んであります。

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プロパティを取得する必要があります:私は、たとえばコントローラで次のLINQを使用してResult.ServiceAgreement.AdditionalItems.SchedultedBasedを使用して、真の値を持つ項目が得ることができます。 PayCycleも配列の場合はどのようにすればいいですか?上記のLinqのData.Itemsで行ったように子どもを取得するにはどうすればいいですか?

答えて

12

あなたはdynamicオブジェクトにJSONをデシリアライズして、オブジェクトへの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<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); 
    } 

私はあなたの例のJSON文字列の周りに括弧{と}を追加する必要がありました注、または.NET jsonパーサーはそれを気に入らない。

+0

PayCycleコレクションはコレクション内のアイテムを1つだけ戻すため、私はわずかに修正しました。たとえば、SelfBillingプロパティを取得するには、where節で次のようにします。where(bool)p ["ResultAction"] ["AdditionalItems"] ["PayCycle"] [0] ["SelfBilling"] == falseです。これは私が探している結果をもたらします。 – KDee

0

私はこのフォーマット["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"] 
       }; 
関連する問題