我想反序列化包含多个对象类型的JSON字符串。例如,这是我的两个POCO类:
public class Car
{
[Key]
public int Id { get; set; }
public string Color { get; set; }
}
public class Driver
{
[Key]
public int Id { get; set; }
public string Firstname { get; set; }
}
现在,我想拥有一个JSON字符串,该字符串具有两个类的对象数组(不相关),并且可以使用Visual Studio中的Newtonsoft json包反序列化为各自的POCO类。
这是否可能,如果可以,JSON格式是什么样的?一个示例将不胜感激,每个类只有2个对象,以显示对象数组和两种类类型共存于一个JSON字符串中,该字符串传递给JsonConvert.DeserializeObject之类。
编辑:这些类和其中的一个对象的JSON分别看起来像:
用于汽车...
[
{
"color": "red"
},
{
"color": "blue"
}
]
以及驱动程序...
[
{
"Firstname": "Fred"
},
{
"Firstname": "Sally"
}
]
但是现在可以将它们组合成一个字符串,但是要使用某种额外的参数来定义每个集合所属的CLASS,例如:
"Car"
[
{
"color": "red"
},
{
"color": "blue"
}
],
"Driver"
[
{
"Firstname": "Fred"
},
{
"Firstname": "Sally"
}
]
看看在单个JSON字符串中如何有2个不相关的类?现在,我想将一个Jsonconvert(如果可能的话)做到各自的类中,以便“ Car”结束时有2个对象,而“ Driver”结束时有2个对象(对于本示例)。
答案 0 :(得分:0)
可以这样做:
using System.Collections;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var objArray = new ArrayList
{
new Car {Id = 1, Color = "blue"},
new Driver {Id = 1, Firstname = "John"},
new Car {Id = 2, Color = "blue"},
new Driver {Id = 2, Firstname = "Jane"}
};
var json = JsonConvert.SerializeObject(objArray);
var jArray = JArray.Parse(json);
foreach (var child in jArray.Children())
{
if (child.Children().Any(token => token.Path.Contains("Color")))
{
// we got a Car
var car = ((JObject) child).ToObject<Car>();
}
else if (child.Children().Any(token => token.Path.Contains("Firstname")))
{
// we got a Driver
var driver = ((JObject) child).ToObject<Driver>();
}
}
}
}
public class Car
{
public int Id { get; set; }
public string Color { get; set; }
}
public class Driver
{
public int Id { get; set; }
public string Firstname { get; set; }
}
}