如何使用点 NET 中的 RestSharp RestClient 将 api return json 数据作为字符串使用

How to consume api that return json data as string using RestSharp RestClient in dot NET

我正在使用 API return 的 json 数据作为字符串。即它的return类型是Task<string>。通常 API return 是 Response class 的对象,然后由 dot NET 序列化。但在这种情况下,API returns 序列化版本的 Response class.

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

_restClient.ExecutePostAsync<Response>(request)

现在我面临的问题是 json 字符串 return 响应 API 的格式为 "{<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);

因为这只会给我 Response class 的对象,但我需要 RestResponse class 的对象来执行验证。

遇到这种情况我该怎么办?

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

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

您还应该查看 RestSharp 的文档,您可以发出将 [Type] 传递给 auto-deserialize 的请求,响应:

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);

希望对您有所帮助!

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

我们将 RestClient 和 RestRequest 初始化为,

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

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

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

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

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

现在我们可以按如下方式进行请求,它会正常工作,

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

我们可以将 T 替换为 class,我们希望在其中反序列化我们的响应。

参考文献:

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