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

本文关键字:net json 对象 使用 反序列化 | 更新日期: 2023-09-27 18:25:04

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

以下是.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。我只是想知道如何编写一些Converter来基于ClassType定义反序列化ClassContent。任何代码示例都将不胜感激。

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

我会采用dynamic方式,比如:

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)意义不大,而且您必须以某种方式将其强制转换为一个具体的类(如果或开关,则使用一些)。

示例:

var container = JsonConvert.DeserializeObject<ContainerClass>(json);
JContainer content = (JContainer)container.ClassContent;
switch(container.ClassType)
{
    case "Class1": return container.ToObject(typeof(ClassOne));
    ..    
}

使用动态和调用.ToObject(类型类型)

dynamic root = JObject.Parse(json)
return root["ClassContent"].ToObject(Type.GetType(root["ClassType"]))

尝试以下

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