2012-10-26 2 views
3

WinRT에서 JSON을 deserialize하고 싶습니다. 예를 들어 StackExchange API 2.1을 사용하려고합니다. \b\0\0\0\0\0\0�ێ���_E�E�FfwW\r,���... :에서 responseText에 나는이 같은 문자를 얻을 내가 잘못 뭐하는 거지JSON Api WinRT에서 개체 역 직렬화

[DataContract] 
class Answer 
{ 
    [DataMember(Name = "question_id")] 
    public int QuestionId { get; set; } 

    [DataMember(Name = "answer_id")] 
    public int AnswerId { get; set; } 

    [DataMember(Name = "creation_date")] 
    public int CreationDate { get; set; } 

    [DataMember(Name = "last_edit_date")] 
    public int LastEditDate { get; set; } 

    [DataMember(Name = "last_activity_date")] 
    public int LastActivityDate { get; set; } 

    [DataMember(Name = "score")] 
    public int Score { get; set; } 

    [DataMember(Name = "community_owned_date")] 
    public int CommunityOwnedDate { get; set; } 

    [DataMember(Name = "is_accepted")] 
    public bool IsAccepted { get; set; } 

    [DataMember(Name = "owner")] 
    public Owner Owner { get; set; } 
} 

[DataContract] 
class Owner 
{ 
    [DataMember(Name = "user_id")] 
    public int UserId { get; set; } 

    [DataMember(Name = "display_name")] 
    public string DisplayName { get; set; } 

    [DataMember(Name = "reputation")] 
    public int Reputation { get; set; } 

    [DataMember(Name = "user_type")] 
    public string UserType { get; set; } 

    [DataMember(Name = "profile_image")] 
    public string ProfileImage { get; set; } 

    [DataMember(Name = "link")] 
    public string Link { get; set; } 

    [DataMember(Name = "accept_rate")] 
    public int? AcceptRate { get; set; } 
} 

[DataContract] 
class JsonResponse 
{ 
    [DataMember(Name = "items")] 
    public IList<Answer> Answers { get; set; } 

    [DataMember(Name = "quota_remaining")] 
    public int QuotaRemaining { get; set; } 

    [DataMember(Name = "quota_max")] 
    public int QuotaMax { get; set; } 

    [DataMember(Name = "has_more")] 
    public bool HasMore { get; set; } 
} 

:

public static async Task<string> GetJsonString() 
     { 
      HttpClient client = new HttpClient(); 
      string url = @"https://api.stackexchange.com/2.1/answers?fromdate=1349913600&order=desc&min=20&sort=votes&site=stackoverflow"; 
      HttpResponseMessage response = await client.GetAsync(url); 
      return await response.Content.ReadAsStringAsync(); 
     } 

     public static async void ParseJson() 
     { 
      string responseText = await GetJsonString(); 

      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonResponse)); 
      JsonResponse root; 
      using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(responseText))) 
      { 
       root = serializer.ReadObject(stream) as JsonResponse; 
      } 
     } 

이러한 클래스 :

는이 같은 방법이 있나요?

+0

이 문제를 일으키는 원인이 될 수 있습니다. 나는 비슷한 코드를 가지고 있으며 잘 작동한다. – Mayank

+0

한가지 차이점은'Encoding.Unicode.GetBytes (responseText)'를 먼저 생성하고이를 'MemoryStream'에 전달한다는 것이지만 생각하지 않는다. 그게 어떤 차이가있을거야 – Mayank

답변

5

URL이 압축 된 데이터를 반환하는 것으로 보이며 HttpClient가이를 이해하지 못합니다. 아래의 코드는이 문제를 해결합니다 :

public static async Task<string> GetJsonString() 
{ 
    HttpClient client = new HttpClient(); 
    string url = @"https://api.stackexchange.com/2.1/answers?fromdate=1349913600&order=desc&min=20&sort=votes&site=stackoverflow"; 
    HttpResponseMessage response = await client.GetAsync(url); 

    byte[] buf = await response.Content.ReadAsByteArrayAsync(); 
    GZipStream zipStream = new GZipStream(new MemoryStream(buf), CompressionMode.Decompress); 
    StreamReader reader = new StreamReader(zipStream); 
    return reader.ReadToEnd(); 
} 
+0

고마워, 네가 옳았 어. –