2013-07-25 117 views
2

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

以下是有助于理解问题的.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。任何代码示例将受到高度赞赏。

回答

1

我会去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)并不意味着什么,你必须将其转换为某种程度上的具体类(使用如果转换)。

0

样品:

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

switch(container.ClassType) 
{ 
    case "Class1": return container.ToObject(typeof(ClassOne)); 
    ..  
} 
0

使用动态和呼叫.ToObject(类型类型)

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

尝试使用以下

var jsonObject = JObject.Parse(jsonString); 

var result = jsonObject.ToObject(Type.GetType("namespace.className")); 
相关问题