2014-11-07 2 views
0

json에서 읽는 데 문제가 있습니다.배열을 사용하여 JSon 결과를 비 직렬화합니다.

다음
{ 
"LoginName": null, 
"EmailAddress": null, 
"FirstName": null, 
"LastName": null, 
"ErrorList": [ 
{ 
"ErrorNumber": 5001, 
"ErrorMessage": "Validation Error: The UserName field is required.", 
"Details": null 
}, 
{ 
"ErrorNumber": 5001, 
"ErrorMessage": "Validation Error: The Password field is required.", 
"Details": null 
}, 
{ 
"ErrorNumber": 1, 
"ErrorMessage": "The username or password is not correct!", 
"Details": null 
} 
] 
} 

내 클래스입니다 : 여기에 내가 무엇을 얻을 json으로 인 내가 예제에서 LoginName 및 EmailAddress를 얻을 수

[DataContract] 
    public class User 
    { 
     [DataMember(Name = "LoginName")] 
     public string loginName { get; set; } 

     [DataMember(Name = "EmailAddress")] 
     public string emailAddress { get; set; } 

     [DataMember(Name = "LastName")] 
     public string lastName { get; set; } 

     [DataMember(Name = "FirstName")] 
     public string firstName { get; set; } 

     [DataMember(Name = "ErrorList")] 
     public ErrorList[] errorList { get; set; } 
    } 
[DataContract] 
    public class ErrorList 
    { 
     [DataMember(Name = "ErrorNumber")] 
     public int errorNumber { get; set; } 

     [DataMember(Name = "ErrorMessage")] 
     public string errorMessage { get; set; } 
    } 

,하지만 난 ErrorList의 요소를 얻을 수 없습니다. 다음은 직렬화 json으로 결과에 대한 코드입니다 : 그것은 작동

var res = await result.Content.ReadAsStringAsync(); 
var answer = JsonConvert.DeserializeObject<User>(res); 
Email.Text = answer.emailAddress; 

,하지만 난 배열에 도달하지 않습니다. 누구든지이 문제를 해결할 생각이 있습니까?

+0

당신에게 ' re missing ErrorList.Details –

+0

json.net에서 정의되지 않은 속성은 무시됩니다. –

+0

ErrorList.Details가 누락 되었습니까? 어디에서? – Speederer

답변

1

, 어쩌면 당신은 대신 System.Runtime.SerializationJSON.NET 속성을 사용합니다.

그래도이 코드에는 아무런 문제가 없습니다. 오류가 다른 곳에서 발생했습니다. var answer = JsonConvert.DeserializeObject<User>(yourJsonHere);로 그대로 제공 JSON과 함께, 당신의 User 클래스를 사용하고, 역 직렬화하면 다음과 제공 :

enter image description here

그래서, 직렬화

answer.errorList.ToList().ForEach(error => 
    Console.WriteLine(@"{0}={1}", error.errorNumber, error.errorMessage)); 

출력 후

5001=Validation Error: The UserName field is required. 
5001=Validation Error: The Password field is required. 
1=The username or password is not correct! 
+0

JSON.NET (Newtonsoft)을 사용합니다. 귀하의 코드를 시도했지만, 처음에는 WP8.1 응용 프로그램이므로, console.writeline을 사용할 수 없습니다. 반면에 나는 foreach 메서드를 answer.errorList.ToList() 뒤에 사용할 수 없다. – Speederer

+0

QuickWatch에서 여전히'answer'를 검사 할 수 있습니까? 'ForEach'는 사용할 수 있어야합니다 http://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspx? –

+0

예, ForEach를 사용할 수 있어야하지만 그렇지 않습니다. 나는 최근에 WP8.1을 위해 개발을 시작했으며 많은 문제를 만난다. 예를 들면. 나는 QuickWatch를 시도 할 것이다. – Speederer

1

JsonProperty를 사용하여 DataMember 속성을 변경해야합니다. 이 작업을해야합니다 : @Abdurrahman Köken가 언급 한 바와 같이

public class User 
{ 
    [JsonProperty("LoginName")] 
    public string loginName { get; set; } 

    [JsonProperty("EmailAddress")] 
    public string emailAddress { get; set; } 

    [JsonProperty("LastName")] 
    public string lastName { get; set; } 

    [JsonProperty("FirstName")] 
    public string firstName { get; set; } 

    [JsonProperty("ErrorList")] 
    public ErrorList[] errorList { get; set; } 
} 

public class ErrorList 
{ 
    [JsonProperty("ErrorNumber")] 
    public int errorNumber { get; set; } 

    [JsonProperty("ErrorMessage")] 
    public string errorMessage { get; set; } 
} 
+0

+1, JSON.NET 특성을 사용하는 것이 "더 깨끗합니다". '[JsonObject]'를 추가하면 완료됩니다. :) 하지만 사실은 원래 코드가 매력처럼 작동합니다. –

+0

불행히도 User 클래스에서만 작동하지만 ErrorList 클래스에서는 작동하지 않습니다. 그래서, 이것은 동일합니다. – Speederer

+0

제 답변을 참조하십시오. –

관련 문제