2013-07-25 4 views
2

일부 JSON 문자열을 .net 객체로 역 직렬화하는 데 문제가 있습니다. 외부로부터의 정보를 담고있는 컨테이너 클래스가 있습니다. 어떤 타입의 정보가 무엇인지를 정의한 필드 호출 ClassType이 있습니다. 실제 내용은 다른 어떤 속성이 될 수 있습니다. 그래서 우리는 그것을 Object 타입으로 정의합니다.json.net을 사용하여 .net 객체에 json을 비 직렬화

다음은 문제를 이해하는 데 도움이되는 .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}} 

나는 JSON 문자열을 역 직렬화하는 Newtonsoft JSON.net 라이브러리를 사용하고 있습니다. deserialize 함수의 기본값을 Newtonsoft.Json.Linq.JContainer으로 deserialize하는 것처럼 보입니다. 난 그냥 ClassType 정의를 기반으로 ClassContent deserialize 일부 변환기 쓸 수 있습니다 궁금해. 모든 코드 샘플을 높이 평가할 것입니다.

답변

1

: 객체 (ClassContent)를 반환하기 때문에

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

많은 의미하지 않는다, 당신은에 캐스팅해야 어떻게 든 구체적인 클래스 (을 사용하면 또는 스위치).

0

샘플 : 내가 좋아하는, dynamic 길을 갈 것

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")); 
관련 문제