2017-04-13 83 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