где я иду не так с десериализацией

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 / serialization.
Показать ещё 1 комментарий
Теги:

1 ответ

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()
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню