Десериализовать JSON с помощью RestSharp - PullRequest
1 голос
/ 20 июня 2020

Я делаю запрос на http://api.weatherapi.com/v1/current.json, используя RetSharp вот так:

        var request = new RestSharp.Serializers.Newtonsoft.Json.RestRequest();
        request.AddHeader("content-type", "application/json");
        var client = new RestClient(URL + urlParameters);
        client.Proxy = WebRequest.DefaultWebProxy; // I was led to believe this will fix my problem of my requests taking minutes on end to execute, but it didn't that much.
        var queryResult = client.Execute(request).Content;
        var response = JsonConvert.DeserializeObject<CurrentJsonResponse>(queryResult);

Это работает нормально, но мне не нравится, что мне нужно сделать отдельный вызов JsonConvert, и, предположительно, RestSharp должен иметь встроенную поддержку такого рода.

Я пробовал следующее:

        var response = client.Execute<CurrentJsonResponse>(request).Data; // returns a CurrentJsonResponse object with null properties.

        request.JsonSerializer = new NewtonsoftJsonSerializer(); // I put it at the very start, but doesn't help.

        var jsonDeserializer = new JsonDeserializer();
        client.AddHandler("application/json", jsonDeserializer); // Second verse, same as the first.

        var response = client.Execute<object>(request).Data; // Correctly creates an annonymous object that has the right properties/information but it's not exactly what I'm going for. As I wanted it strongly-typed.

Ничего не сработало. Как я могу десериализовать ответ json, который я получаю с помощью RestSharp явно, без отдельного вызова Newtonsoft. Я загрузил RestSharp.Serializers.Newtonsoft.Json nuget.

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Во второй попытке попробуйте изменить

 var jsonDeserializer = new JsonDeserializer();
 client.AddHandler("application/json", jsonDeserializer);

на

client.AddHandler("application/json", () => new RestSharp.Serializers.Newtonsoft.Json.NewtonsoftJsonSerializer());

и позвоните:

var response = client.Execute<CurrentJsonResponse>(request).Data;
0 голосов
/ 20 июня 2020

Десериализация по умолчанию должна работать нормально, мне нужно было только изменить некоторые настройки сериализации во время post запроса.

   var request = new RestRequest();    
   var restClient = new RestClient(endPoint);

   request.Method = Method.GET;

   request.AddHeader("Content-Type", "application/json");

   var response = restClient.Execute<T>(request);

       if (response.ErrorException != null)
       {
            //log the exception
            //throw exception;
       }
   return response.Data;

По моему опыту, я видел, что десериализация по умолчанию не дает ожидаемый результат, если класс сопоставления не соответствует требованиям. Убедитесь, что вы правильно преобразовали ответ JSON в соответствующий ему класс c#.

...