C#如何正确地将数组中的多个自定义对象反序列化为一个对象?
我正在检索一个包含多个对象类型的数组的json对象 假设我检索的JSON负载如下所示:C#如何正确地将数组中的多个自定义对象反序列化为一个对象?,c#,json,deserialization,json-deserialization,C#,Json,Deserialization,Json Deserialization,我正在检索一个包含多个对象类型的数组的json对象 假设我检索的JSON负载如下所示: { "Lines": [ { "PropertyA": "A", "PropertyB": "B" }, { "Property01": 1, "Property02": 2 }] } 我想将其反序列化为单个对象列表 例如: public List<Line> Lines; 公共列表行; 所以我可以把这个对
{
"Lines": [
{
"PropertyA": "A",
"PropertyB": "B"
},
{
"Property01": 1,
"Property02": 2
}]
}
我想将其反序列化为单个对象列表
例如:
public List<Line> Lines;
公共列表行;
所以我可以把这个对象和我期望的对象进行比较
到目前为止,我所拥有的:
public class Class1
{
public string PropertyA = "A";
public string PropertyB = "B";
}
public class Class2
{
public int Property01 = 01;
public int Property02 = 02;
}
public class MainClass
{
public List<dynamic> Lines;
}
class Program
{
static void Main(string[] args)
{
string json = "{\r\n \"Lines\": [\r\n {\r\n \"PropertyA\": \"A\",\r\n \"PropertyB\": \"B\"\r\n },\r\n {\r\n \"Property01\": 1,\r\n \"Property02\": 2\r\n }]\r\n}";
MainClass actual = JsonConvert.DeserializeObject<MainClass>(json);
MainClass expected = new MainClass()
{
Lines = new List<dynamic>()
{
new Class1(),
new Class2()
}
};
actual.Should().BeEquivalentTo(expected);
}
}
公共类1
{
公共字符串PropertyA=“A”;
公共字符串PropertyB=“B”;
}
公共课2
{
公共int属性01=01;
公共int属性02=02;
}
公共类主类
{
公共列表行;
}
班级计划
{
静态void Main(字符串[]参数)
{
字符串json=“{\r\n\”Lines\”:[\r\n{\r\n\“PropertyA\”:“A\”,\r\n\“PropertyB\”:“B\”\r\n},\r\n{\r\n\“Property01\”:1\r\n\“Property02\”:2\r\n}]\r\n}”;
MainClass actual=JsonConvert.DeserializeObject(json);
预期的MainClass=新的MainClass()
{
行=新列表()
{
新类别1(),
新类别2()
}
};
实际的.Should().beequivalento(预期的);
}
}
任何帮助都将不胜感激
欢呼声首先将字段更改为属性。然后,这里最简单的方法是创建一个表示两个对象的公共对象,如下所示:
public class Class1
{
public string PropertyA {get;set;}
public string PropertyB {get;set;}
public int Property01 {get;set;}
public int Property02 {get;set;}
}
public class MainClass
{
public List<Class1> Lines;
}
MainClass actual = JsonConvert.DeserializeObject<MainClass>(json);
另一种方法是使用JArray并使用此对象继续您的逻辑:
JArray arr = JArray.Parse(json);
首先将字段更改为属性。然后,这里最简单的方法是创建一个表示两个对象的公共对象,如下所示:
public class Class1
{
public string PropertyA {get;set;}
public string PropertyB {get;set;}
public int Property01 {get;set;}
public int Property02 {get;set;}
}
public class MainClass
{
public List<Class1> Lines;
}
MainClass actual = JsonConvert.DeserializeObject<MainClass>(json);
另一种方法是使用JArray并使用此对象继续您的逻辑:
JArray arr = JArray.Parse(json);
您可以验证适当的名称,并在正确的对象中进行反序列化,如下所示
class Program
{
static void Main(string[] args)
{
var class1List = new List<Class1>();
var class2List = new List<Class2>();
var genericList = new List<dynamic>();
var actual = JsonConvert.DeserializeObject<dynamic>(json);
foreach (var item in actual.Lines)
{
string itemJson = JsonConvert.SerializeObject(item);
if (itemJson.Contains("PropertyA"))
{
var class1 = JsonConvert.DeserializeObject<Class1>(itemJson);
class1List.Add(class1);
genericList.Add(class1);
}
else
{
var class2 = JsonConvert.DeserializeObject<Class2>(itemJson);
class2List.Add(class2);
genericList.Add(class2);
}
}
}
}
public class Class1
{
public string PropertyA;
public string PropertyB;
}
public class Class2
{
public int Property01;
public int Property02;
}
类程序
{
静态void Main(字符串[]参数)
{
var classalist=新列表();
var class2List=新列表();
var genericList=新列表();
var-actual=JsonConvert.DeserializeObject(json);
foreach(实际行中的var项)
{
string itemJson=JsonConvert.SerializeObject(item);
if(itemJson.Contains(“PropertyA”))
{
var class1=JsonConvert.DeserializeObject(itemJson);
classlist.Add(class1);
添加(类别1);
}
其他的
{
var class2=JsonConvert.DeserializeObject(itemJson);
class2List.Add(class2);
一般列表。添加(类别2);
}
}
}
}
公共班级1
{
公共字符串属性a;
公共字符串属性b;
}
公共课2
{
公共物业01;
公共财产02;
}
您可以验证适当的名称,并在右侧对象中进行反序列化,如下所示
class Program
{
static void Main(string[] args)
{
var class1List = new List<Class1>();
var class2List = new List<Class2>();
var genericList = new List<dynamic>();
var actual = JsonConvert.DeserializeObject<dynamic>(json);
foreach (var item in actual.Lines)
{
string itemJson = JsonConvert.SerializeObject(item);
if (itemJson.Contains("PropertyA"))
{
var class1 = JsonConvert.DeserializeObject<Class1>(itemJson);
class1List.Add(class1);
genericList.Add(class1);
}
else
{
var class2 = JsonConvert.DeserializeObject<Class2>(itemJson);
class2List.Add(class2);
genericList.Add(class2);
}
}
}
}
public class Class1
{
public string PropertyA;
public string PropertyB;
}
public class Class2
{
public int Property01;
public int Property02;
}
类程序
{
静态void Main(字符串[]参数)
{
var classalist=新列表();
var class2List=新列表();
var genericList=新列表();
var-actual=JsonConvert.DeserializeObject(json);
foreach(实际行中的var项)
{
string itemJson=JsonConvert.SerializeObject(item);
if(itemJson.Contains(“PropertyA”))
{
var class1=JsonConvert.DeserializeObject(itemJson);
classlist.Add(class1);
添加(类别1);
}
其他的
{
var class2=JsonConvert.DeserializeObject(itemJson);
class2List.Add(class2);
一般列表。添加(类别2);
}
}
}
}
公共班级1
{
公共字符串属性a;
公共字符串属性b;
}
公共课2
{
公共物业01;
公共财产02;
}
您的内部部分(propa、propb和prop1、prop2)将反序列化为JSON数组,而不是您想要的反序列化为类的内容。您必须在数组中导航并获取数据。您的内部部分(propa、propb和prop1、prop2)将反序列化为JSON数组,而不是您想要的反序列化为类的内容。您必须在阵列中导航并获取数据。谢谢。像你在这里展示的那样自己解析它可能是我在保持类独立的同时进行解析的最好方法。谢谢。像您在这里展示的那样自己解析它可能是我在保持类分离的同时进行解析的最好方法。