如何反序列化包含来自不同类的对象的JSON字符串?

时间:2019-04-20 17:05:19

标签: c# json.net

我想反序列化包含多个对象类型的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个对象(对于本示例)。

1 个答案:

答案 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; }
    }
}