2013-07-25 2 views
2

У меня возникла проблема десериализации некоторой строки JSON обратно в .net-объекты. У меня есть класс контейнера, который содержит некоторую информацию от внешнего и есть полевой вызов ClassType, который определяет тип информации, а фактический контент находится в другом свойстве, которое в настоящее время может быть чем угодно, поэтому мы определяем его как тип объекта.deserialize 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. Мне просто интересно, как я могу написать какой-нибудь конвертер для десериализации ClassContent на основе определения ClassType. Любой образец кода будет высоко оценен.

ответ

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 (тип Type)

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"));