使用LINQ从Json对象生成自定义对象列表

时间:2017-04-13 13:53:56

标签: c# json linq

目前,我正面临着创建LINQ语句的问题,该语句将生成我想要的对象列表。以下部分是我要处理的LINQ对象的示例。

{
  "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个参数(Param1,Param2和Param3)。类别。另外,我想只选择 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();

2 个答案:

答案 0 :(得分:1)

json示例中的

"result"是一个包含一个数组的数组,其中包含您的对象。

因此要么改变json以使"result"是一维数组,要么改为:

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

答案 1 :(得分:0)

你正试图一次做两件事。

  1. 您正在尝试将JSON反序列化为对象。
  2. 您正在尝试过滤返回的结果。
  3. 我建议您将它们视为单独的操作,以简化您的代码。

    使用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();