我正在使用一个以字符串形式返回json数据的API。那就是它的返回类型是Task<string>
.通常,API 返回响应类的对象,然后由 dot NET 序列化。但在这种情况下,API 返回响应类的序列化版本。
我正在尝试使用RestSharp->RestClient使用此API。在 RestClient 方法 ExecutePostAsync
_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);
我希望这有帮助!