如何使用在 dot NET 中使用 RestSharp RestClient 以字符串形式返回 json 数据的 api



我正在使用一个以字符串形式返回json数据的API。那就是它的返回类型是Task<string>.通常,API 返回响应类的对象,然后由 dot NET 序列化。但在这种情况下,API 返回响应类的序列化版本。

我正在尝试使用RestSharp->RestClient使用此API。在 RestClient 方法 ExecutePostAsync(request) 中,该方法将响应反序列化为代替 T 指定的类对象。我有一个名为响应类的类,我希望在其中反序列化响应。所以,我提出要求是,

_restClient.ExecutePostAsync<Response>(request)

现在我面临的问题是 API 响应返回的 json 字符串是形式"{<json-fields>}",但是当收到到 RestClient 时,它是形式"{<json-fields>}"。也就是说,转义字符被添加到其中。因此,RestClient 用于序列化和反序列化的 NewtonSoftJSON 给出了错误,Error converting "{<json-fields>}" to Response class

此外,我需要来自RestClient的原始RestResponse,因为我正在RestResponse上执行验证。所以,不能做,将响应作为字符串获取并反序列化。那是我不想做,

var restResponse = _restClient.ExecutePostAsync<string>(request);
var data = Deserialize(restResponse.Data);

因为这只会给我响应类的对象,但我需要 RestResponse<响应>类的对象来执行验证。

在这种情况下我该怎么办?

通过对互联网的一些研究,我找到了以下解决方案,

我们将 RestClient 和 RestRequest 初始化为:

RestClient restClient = new RestClient();
RestRequest request = new RestRequest(<url>);

现在,由于来自 api 的响应是来自简单字符串的 json 数据,我们可以指示请求接受文本响应,如下所示,

restRequest.AddHeader("Accept", "text/plain");

现在,默认情况下,RestClient 不会对响应类型text/plain使用 NewtonSoftJson 反序列化。因此,我们需要添加一个处理程序来告诉 RestClient 使用 NewtonSoftJson 反序列化,如下所示:

restClient.AddHandler("text/plain", () => new RestSharp.Serializers.NewtonsoftJson.JsonNetSerializer());

现在我们可以提出如下请求,它将正常工作,

restRequest.AddJsonBody(<body>);
restClient.ExceutePostAsync<T>(restRequest);

我们可以将T替换为我们希望反序列化响应的类。

引用:

https://github.com/restsharp/RestSharp/issues/276

使用 RestSharp 反序列化 JSON

如果您无法将 api 修复为 json 格式的响应,我看到的唯一方法是清理您的字符串响应:

var data = Deserialize(restResponse.Data.ToString.Replace('"',(char)0));

此外,您应该检查 RestSharp 的文档,您可以发出传递 [Type] 的请求以自动反序列化响应:

var request = new CreateOrder("123", "foo", 10100);
// Will post the request object as JSON to "orders" and returns a 
// JSON response deserialized to OrderCreated  
var result = client.PostJsonAsync<CreateOrder, **OrderCreated**>("orders", request, cancellationToken);

我希望这有帮助!

相关内容

  • 没有找到相关文章

最新更新