C# 使用json.net将json反序列化为.net对象

C# 使用json.net将json反序列化为.net对象,c#,.net,serialization,json.net,deserialization,C#,.net,Serialization,Json.net,Deserialization,将某些JSON字符串反序列化回.net对象时遇到问题。我有一个容器类,它包含一些来自外部的信息,有一个字段调用ClassType,它定义了信息的类型,实际内容在另一个属性中,当前可以是任何内容,因此我们将其定义为对象类型 下面是有助于理解问题的.net类定义 class ClassOne { public string Name { get; set; } public int Age { get; set; } } class ClassTwo { public st

将某些JSON字符串反序列化回.net对象时遇到问题。我有一个容器类,它包含一些来自外部的信息,有一个字段调用
ClassType
,它定义了信息的类型,实际内容在另一个属性中,当前可以是任何内容,因此我们将其定义为对象类型

下面是有助于理解问题的.net类定义

class ClassOne
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class ClassTwo
{
    public string AddressLine { get; set; }
    public string AddressLine2 { get; set; }
}

class ClassThree
{
    public string Country { get; set; }
    public string Passport { get; set; }
}

class ContainerClass
{
    public string ClassType { get; set; }
    public object ClassContent { get; set; }
}
当以JSON格式从外部获取信息时,类似于:

{"ClassType":"Class1","ClassContent":{"Name":"James","Age":2}}
我正在使用Newtonsoft JSON.net库来反序列化JSON字符串。似乎默认的反序列化函数只是将其反序列化为
Newtonsoft.Json.Linq.JContainer
。我只是想知道如何根据
ClassType
定义编写一些转换器来反序列化
ClassContent
。任何代码示例都将受到高度赞赏。

示例:

var container = JsonConvert.DeserializeObject<ContainerClass>(json);
JContainer content = (JContainer)container.ClassContent;

switch(container.ClassType)
{
    case "Class1": return container.ToObject(typeof(ClassOne));
    ..    
}
var container=JsonConvert.DeserializeObject(json);
JContainer content=(JContainer)container.ClassContent;
开关(container.ClassType)
{
案例“Class1”:返回容器.ToObject(typeof(ClassOne));
..    
}

我会选择动态的方式,比如:

string json = @"{""ClassType"":""Class1"",""ClassContent"":{""Name"":""James"",""Age"":2}}";

dynamic jObj = JObject.Parse(json);
if (jObj.ClassType == "Class1")
{
    Console.WriteLine("{0} {1}", jObj.ClassContent.Name, jObj.ClassContent.Age);
}

因为返回一个对象(ClassContent)并没有多大意义,您必须以某种方式将其转换为一个具体的类(使用一些if或switch)。

使用dynamic和call.ToObject(Type)

试试下面的方法

 var jsonObject = JObject.Parse(jsonString);

 var result = jsonObject.ToObject(Type.GetType("namespace.className"));
 var jsonObject = JObject.Parse(jsonString);

 var result = jsonObject.ToObject(Type.GetType("namespace.className"));