2013-07-25 171 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")); 
相關問題