2014-09-04 9 views
1

Я пытаюсь получить общее количество вопросов о stackoverflow для упражнений, которые я выполняю, и застрял в десериализации., где я ошибаюсь при десериализации

Я был бы признателен, если кто-то может сообщить мне, что мне нужно сделать, может быть, предоставить какой-то пример кода, который бы мне помог.

, когда я запускаю это в консоли я получаю ошибка «Была ошибку десериализации объекта типа. Обнаружен неожиданного характера», которая является направленным вниз треугольником ...

это то, что у меня есть до сих пор

using System; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Web; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Json; 


namespace cs_StackOverflowAPI 
{ 
    [DataContract(Namespace = "http://schemas.microsoft.com/search/local/ws/rest/v1")] 
    public class Question 
    { 
     [DataMember(Name = "question_id")] 
     public int Questions { get; set; } 

    } 

    [DataContract] 
    public class ResourceSet 
    { 
     [DataMember(Name = "estimatedTotal")] 

     public long EstimatedTotal { get; set; } 
     [DataMember(Name = "resources")] 
     public Question[] Resources { get; set; } 
    } 

    [DataContract] 
    public class Response 
    { 

     [DataMember(Name = "statusCode")] 
     public int StatusCode { get; set; } 
     [DataMember(Name = "statusDescription")] 
     public string StatusDescription { get; set; } 
     [DataMember(Name = "authenticationResultCode")] 
     public string AuthenticationResultCode { get; set; } 
     [DataMember(Name = "errorDetails")] 
     public string[] errorDetails { get; set; } 
     [DataMember(Name = "traceId")] 
     public string TraceId { get; set; } 
     [DataMember(Name = "resourceSets")] 
     public ResourceSet[] ResourceSets { get; set; } 
    } 



    class Program 
    { 
     public string serverUrl = "https://api.stackexchange.com/"; 
     public HttpClient client = null; 

     static void Main(string[] args) 
     { 
      try 
      { 
       string noOfQuestions = CreateRequest("questions"); 
       Response noOfQuestionsReponse = MakeRequest(noOfQuestions); 
       ProcessResponse(noOfQuestionsReponse); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.Read(); 
      } 

     } 


     public static string CreateRequest(string queryString) 
     { 
     string UrlRequest = "https://api.stackexchange.com/2.2/" + 
           queryString + 
           "?&site=stackoverflow"; 
      return (UrlRequest); 
     } 

     public static Response MakeRequest(string requestUrl) 
     { 
      try 
      { 
       HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; 
       using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
       { 
        if (response.StatusCode != HttpStatusCode.OK) 
         throw new Exception(String.Format(
         "Server error (HTTP {0}: {1}).", 
         response.StatusCode, 
         response.StatusDescription)); 
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Response)); 
        object objResponse = jsonSerializer.ReadObject(response.GetResponseStream()); 
        Response jsonResponse 
        = objResponse as Response; 
        return jsonResponse; 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       return null; 
      } 
     } 

     static public void ProcessResponse(Response noOfQuestionsReponse) 
     { 

      // this is where the error occurs 
      Console.WriteLine("Press any key to exit"); 
      Console.ReadKey(); 
     } 


     public static long ToUnixTime(DateTime date) 
     { 
      var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
      return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds); 
     } 
    } 
} 
+0

Рассматривались ли вы просто с помощью StacMan или другой существующей библиотеки? –

+0

Я не знаю о SO api и никогда не встречал «направленный вниз треугольник ...», но я бы предложил вам использовать библиотеку NewtonSoft.Json для json de/serializations. –

+0

https://api.stackexchange.com/2.2/questions?&site=stackoverflow ответ этого URL не совпадает со свойствами класса Response – Patel

ответ

1

Он возвращает сжатый контент (в частности, gzip). Если возможно, сообщите ваш клиент HTTP автоматически распаковывает его:

request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); 
request.AutomaticDecompression = 
    DecompressionMethods.GZip | DecompressionMethods.Deflate; 

Следующий вопрос: схема не соответствует; вопросы находятся в items от корня:

[DataContract] 
public class Response 
{ 
    [DataMember(Name ="items")] 
    List<Question> questions { get;set; } 
} 
+0

, где бы вы предположили, что это происходит? У меня очень ограниченный опыт такого рода запросов. –

+0

@SimonPrice непосредственно перед 'GetResponse()' –

+0

@SimonPrice и снова, в этом случае я настоятельно рекомендую использовать такой инструмент, как StacMan –

Смежные вопросы