【问题标题】:Deserialize JSON with RestSharp使用 RestSharp 反序列化 JSON
【发布时间】:2020-06-20 14:03:45
【问题描述】:

我正在使用RetSharphttp://api.weatherapi.com/v1/current.json 发出请求,如下所示:

        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.

没有任何效果。如何在不单独调用 Newtonsoft 的情况下明确反序列化使用 RestSharp 获得的 json 响应。我已经下载了RestSharp.Serializers.Newtonsoft.Json nuget。

【问题讨论】:

  • 你试过var response = client.Execute&lt;CurrentJsonResponse&gt;(request).Datavar response = client.Execute&lt;CurrentJsonResponse&gt;(request)吗?
  • @GuruStron, var response = client.Execute&lt;CurrentJsonResponse&gt;(request).Data 是我尝试过的第一件事。我想我也尝试过另一个,但现在会测试并更新。
  • Doc 非常坚持 Execute&lt;T&gt;(request).Data 应该可以工作 =)
  • @GuruStron,正如我所想的那样 - 我已经尝试过 var response = client.Execute&lt;CurrentJsonResponse&gt;(request),但是它只返回请求对象、状态码和所有内容。
  • @GuruStron,我在给定的文档中没有看到任何关于 newtonsoft 反序列化的提及,但谢天谢地,你的答案是......好吧,答案。

标签: c# json rest


【解决方案1】:

在您的第二次尝试中尝试更改

 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;

【讨论】:

    【解决方案2】:

    默认反序列化应该可以正常工作,我只需要在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# 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多