C# 使用LINQ从Json对象生成自定义对象列表
目前,我面临一个创建LINQ语句的问题,该语句将生成我想要的对象列表。以下部分是我要处理的LINQ对象的示例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"
{
"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.
你试图同时做两件不同的事情
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();