【发布时间】:2019-11-11 15:17:17
【问题描述】:
我有一个与此类似的方法,我在其中执行请求并反序列化通用对象。
public T Execute<T>(RestRequest request) where T : new()
{
request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment); // used on every request
var response = _client.Execute<T>(request);
return response.Data;
}
响应反序列化如下:
public T Deserialize<T>(IRestResponse response) => return JsonConvert.DeserializeObject<T>(response.Content);
我也有这样的课:
public class SomeResponse
{
public string Id { get; set; }
}
问题是我无法反序列化某些请求的响应,因为出于某种原因它只是一个原始字符串,不在 JSON 对象内。响应如下所示:
"abc123"
我从中获取数据的大多数 API 都返回 JSON 对象,因此它可以正常工作。我想避免仅为该边缘情况创建另一个 Execute 方法。
我已经开始了这样的事情,但它似乎有点 hacky。我觉得应该有一个更简单的方法来做到这一点
public T Deserialize<T>(IRestResponse response)
{
try
{
return JsonConvert.DeserializeObject<T>(response.Content);
}
catch
{
var content = response.Content;
response.Content = $"{{ \"Id\" : {response.Content} }}";
return JsonConvert.DeserializeObject<T>(response.Content);
}
}
【问题讨论】:
-
在您的边缘情况下,响应中的 ContentType 是什么?它仍然是“应用程序/json”还是其他什么?此外,是否始终保证纯字符串代表您的
T上的 ID,或者它是否可能代表其他内容? -
ContentType 仍然是 application/json。我认为还有更多的端点返回一个字符串,所以我正在考虑对响应对象进行更多概括,以便它包含一个“stringresponse”属性而不是一个特定的“id”
标签: .net reflection json.net restsharp