2017-04-13 12 views
1

現在、私は、必要なオブジェクトのリストを生成するLINQ文を作成する問題に直面しています。次のセクションは、処理したいLINQオブジェクトの例です。LINQを使用してJsonオブジェクトからカスタムオブジェクトのリストを生成

{ 
    "successful": "true", 
    "result": [ 
    [ 
     { 
     "Param1": "A1", 
     "Param2": "A2", 
     "Param3": "A3", 
     "Param4": "A4", 
     "Param5": "1", 
     "Param6": "A5", 
     }, 
     { 
     "Param1": "B1", 
     "Param2": "B2", 
     "Param3": "B3", 
     "Param4": "B4", 
     "Param5": "2", 
     "Param6": "B5", 
     }, 
     { 
     "Param1": "C1", 
     "Param2": "C2", 
     "Param3": "C3", 
     "Param4": "C4", 
     "Param5": "2", 
     "Param6": "C5", 
     } 
    ] 
    ] 
} 

従うように私は、カスタム・オブジェクト・クラスを持って、

public class CContainer 
{ 
    public string param1{ get; set; } 

    public string param2{ get; set; } 

    public string param3{ get; set; } 
} 

私の最終目標は、最初の3つのパラメータ(Param1を、PARAM2、およびParam3)を含有している、CContainerオブジェクトのリストを作成することです'結果'カテゴリの各項目についてまた、Param5 == "2"の項目だけを選択したいと思います。私は現在LINQを使用してそれを行うことができません、アドバイスをしてください。

次のスニペットは機能しません( 'Where'句を削除しても)。

List<CContainer> testList = new List<CContainer>(); 
    string responseRet = await response.Content.ReadAsStringAsync(); 
    JObject o = JObject.Parse(responseRet); 

    testList = 
    (from item in o["result"] 
     where item["Param5"].Value<string>() == "2" 
     select new CCOntainer 
     { 
      param1 = item["Param1"].Value<string>(), 
      param2 = item["Param2"].Value<string>(), 
      param3 = item["Param3"].Value<string>(), 
     }).ToList(); 
+1

なぜarあなたはプロパティ属性とJsonConvert.Deserialize ()メソッドを使用していませんか? – toadflakz

+0

Deserializeメソッドを使用して特定の条件で結果の下でParam1、Param2、Param3のみを抽出する方法がわかりません。 – Ytan

+1

あなたの 'results'プロパティが単一の要素を持つ配列であることを知っていますか?その単一の要素自体が' CContainer'オブジェクトの配列ですか?それは間違いか故意ですか? – Jamiec

答えて

0

  1. JSONをオブジェクトに逆シリアル化しようとしています。
  2. 返された結果をフィルタリングしようとしています。

あなたのコードを単純化するために、それらを別々の操作として扱うことをお勧めします。次のようJsonConvert.DeserializeObject<T>()セットアップあなたのクラスを使用して、すべてのオブジェクトをデシリアライズする

[JsonObject(MemberSerialization.OptIn)] 
public class Result 
{ 
    [JsonProperty("success")] 
    public bool Success{ get; set; } 

    [JsonProperty("result")] 
    public List<List<JsonCContainer>> Items{ get; set; } 

} 

[JsonObject(MemberSerialization.OptIn)] 
public class JsonCContainer 
{ 
    [JsonProperty("Param1")] 
    public string param1{ get; set; } 

    [JsonProperty("Param2")] 
    public string param2{ get; set; } 

    [JsonProperty("Param3")] 
    public string param3{ get; set; } 

    [JsonProperty("Param5")] 
    public string param5{ get; set; } 

} 

public class CContainer 
{ 
    public string param1{ get; set; } 
    public string param2{ get; set; } 
    public string param3{ get; set; } 
} 

あなたは、次のコードを使用してResultオブジェクトを取得します:あなたはあなたのResultクラスを持ったら

string responseRet = await response.Content.ReadAsStringAsync(); 
Result resultObj = JsonConvert.DeserializeObject<Result>(responseRet); 

オブジェクトをフィルタリングします:

return resultObj.Items.SelectMany(x => x) 
       .Where(x => x.param5 == "2") 
       .Select(y => new CContainer() 
           { 
            param1 = y.param1, 
            param2 = y.param2, 
            param3 = y.param3 
           }).ToList(); 
+0

本当に素晴らしいコードですが、json構造が問題です。 – ImDarrenG

+0

多次元配列を処理するように更新されました。 – toadflakz

1

jsonサンプルでは、​​オブジェクトを含む1つの配列を含む配列です。

だから、どちらか"result"は、1次元配列、または、の線に沿って何かであるように、JSONを変更する:あなたが一度に2つの異なるものをやろうとしている

testList = 
(from item in o["result"].FirstOrDefault() 
// etc. 
+0

ありがとう、最初の要素を抽出した後、私が望むリストに処理することができます。JSONオブジェクトの設計と思います。 – Ytan

関連する問題