2016-09-20 16 views
1

나는 JavaScriptSerializer 클래스를 사용하여 MediaWiki 웹 응용 프로그램에서 반환하는 JSON 비트를 디코딩하는 데스크탑 응용 프로그램을 가지고 있습니다. 이것은 대부분 쉽게 알아낼 수 있었지만 필드 이름 중 하나 인 "*"가 포함 된 특정 JSON 응답이 있었고이를 어떻게 처리해야하는지 모르겠습니다. '나는 login 하위 객체에 대한 결과를 포함 할 rLogin 클래스를 생성 한"*"속성을 사용하여 JSON 문자열을 비 직렬화하려면 어떻게해야합니까?

{ 
    "warnings": { 
     "login": { 
      "result": "OK", 
      "*": "blah blah blah" 
     } 
    } 
} 

, 그 클래스에 나는 result에 대한 문자열을 enter code here 객체를 만든하지만 난 돈 : 여기

는 일부 샘플 JSON의 다른 분야에서해야 할 일을 알고 있습니다. 분명히 나는 ​​ *이라는 이름으로 클래스에 필드를 만들 수 없으므로 값을 얻는 방법은 무엇일까요?

+0

실제로'result' 키는 실제 파일에서 따옴표가 누락 되었습니까? 아니면 질문의 예에서 오타였습니까? –

+0

아, 그냥 오타였습니다. 유감입니다. 실제로 결과 필드가 전혀 없습니다 ... 나는 방금 문자열 객체를 추가 한 다른 필드의 예제로 추가했습니다. –

답변

2

JavaScriptConverter을 만들어야합니다.

JavaScriptConverter 클래스는 기본적으로 JavaScriptSerializer 클래스에서 지원 없는 관리 유형에 대한 직렬화 및 역 직렬화 프로세스를 구현할 수 있습니다.

둥지 때문에 가장 간단하지 않지만 원유를 두드리고 성공적으로 Linqpad에서 테스트했습니다.

public class ResultConverter : JavaScriptConverter 
{ 
    private static readonly IEnumerable<Type> supportedTypes = new List<Type> { typeof(Warnings) }; 

    public override IEnumerable<Type> SupportedTypes => supportedTypes; 

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     var warningsDictionary = dictionary["warnings"] as IDictionary<string, object>; 
     var loginDictionary = warningsDictionary["login"] as IDictionary<string, object>; 

     var login = new Login 
     { 
      Result = loginDictionary["result"] as string, 
      Details = loginDictionary["*"] as string, 
     }; 

     return new Warnings { Login = login }; 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

지원 클래스와 사용법 :

void Main() 
{ 
    string json = @"{ ""warnings"": { ""login"": { result: ""OK"", ""*"": ""blah blah blah"" } } }"; 

    var js = new JavaScriptSerializer(); 
    js.RegisterConverters(new List<JavaScriptConverter> { new ResultConverter() }); 
    var result = js.Deserialize<Warnings>(json); 
    Console.WriteLine(result); 
} 

public class Login 
{ 
    public string Result { get; set; } 
    public string Details { get; set; } 
} 

public class Warnings 
{ 
    public Login Login { get; set; } 
} 

우리의 출력에서 ​​우리가 지금 Details 속성에 "ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ"가 관련 부분은 여기에 우리의 Deserialize()의 구현입니다.