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

C# 使用LINQ从Json对象生成自定义对象列表,c#,json,linq,C#,Json,Linq,目前,我面临一个创建LINQ语句的问题,该语句将生成我想要的对象列表。以下部分是我要处理的LINQ对象的示例 { "successful": "true", "result": [ [ { "Param1": "A1", "Param2": "A2", "Param3": "A3", "Param4": "A4", "Param5": "1", "Param6": "A5"

目前,我面临一个创建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)。另外,我只想选择其参数为5==“2”的项目。我目前无法使用LINQ实现这一点,请给出建议

以下代码段不起作用(即使我删除了Where子句)

List testList=newlist();
string responseRet=await response.Content.ReadAsStringAsync();
JObject o=JObject.Parse(responseRet);
测试列表=
(从o中的项目[“结果”]
其中项[“Param5”].Value()=“2”
选择新容器
{
param1=项[“param1”].Value(),
param2=项[“param2”].Value(),
param3=项[“param3”]。值(),
}).ToList();
“result”
在json示例中是一个包含一个数组的数组,其中包含您的对象

因此,要么更改json,使
“result”
是1D数组,要么是以下内容:

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

你试图同时做两件不同的事情

  • 您正在尝试将JSON反序列化为对象
  • 您正在尝试筛选返回的结果
  • 我建议您将它们作为单独的操作来处理,以简化代码

    要使用
    JsonConvert.DeserializeObject()
    反序列化所有对象,请按如下方式设置类:

    [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; }
    }
    
    获得
    结果后
    类对象,然后执行过滤:

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

    为什么不使用property attributes和JsonConvert.Deserialize()方法?我不知道如何在使用Deserialize方法的特定条件下仅提取结果下的Param1、Param2、Param3。是否知道您的
    结果
    属性是一个包含单个元素的数组。。。这个元素本身就是
    CContainer
    对象的数组?这是一个错误还是故意的?我刚刚意识到这是一个包含单个元素的数组。我不熟悉JSON,我认为这种格式是故意的,我不能改变它。感谢您指出。一些非常好的代码,但json结构是问题所在。更新以处理多维数组。谢谢,在提取第一个元素后,我可以将其处理为我想要的列表,我想这是json对象的设计。
    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();