我在将某些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
。任何代码示例都将不胜感激。
我会采用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"));