2017-04-13 84 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; } 
} 

我的最終目標是創建CContainer對象的列表,只包含前3個參數(參數1,參數2和參數3)對於「結果」類別下的每個項目。另外,我想只選擇它的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對象用下面的代碼:

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

一旦你得到了你的Result類對象,然後做過濾:

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

"result"在您的json示例中是一個包含一個數組的數組,其中包含您的對象。

因此,要麼改變JSON使"result"是一維數組,或者,沿着線的東西:

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

謝謝,解壓後的第一個元素,我可以處理它到我想要的列表,我猜它是JSON對象的設計。 – Ytan