当响应是原始字符串时无法反序列化 Restsharp 响应
Cannot deserialize Restsharp response when the response is a raw string
我有一个与此类似的方法,我在其中执行请求并反序列化通用对象。
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);
我也有一个这样的class:
public class SomeResponse
{
public string Id { get; set; }
}
问题是我无法反序列化某些请求的响应,因为出于某种原因它只是一个不在 JSON 对象内的原始字符串。响应如下所示:
"abc123"
我从中获取数据的大多数 API 都返回 JSON 对象,因此它工作正常。我想避免仅为该边缘情况创建另一个 Execute 方法。
我已经开始做类似的事情,但它看起来有点老套。我觉得应该有一个更简单的方法来做到这一点
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);
}
}
我暂时用这个方法解决了这个问题。只有一种方法 returns 原始字符串。更好的解决方案仍然值得赞赏。
public T Deserialize<T>(IRestResponse response)
{
try
{
return JsonConvert.DeserializeObject<T>(response.Content);
}
catch
{
if (typeof(T) != typeof(SomeResponse))
{
throw;
}
response.Content = $"{{ \"Id\" : {response.Content} }}";
return JsonConvert.DeserializeObject<T>(response.Content);
}
}
另一个选择是这个
public T Deserialize<T>(IRestResponse response)
{
if (typeof(T) == typeof(SomeResponse))
{
response.Content = $"{{ \"Id\" : {response.Content} }}";
}
return JsonConvert.DeserializeObject<T>(response.Content);
}
我有一个与此类似的方法,我在其中执行请求并反序列化通用对象。
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);
我也有一个这样的class:
public class SomeResponse
{
public string Id { get; set; }
}
问题是我无法反序列化某些请求的响应,因为出于某种原因它只是一个不在 JSON 对象内的原始字符串。响应如下所示:
"abc123"
我从中获取数据的大多数 API 都返回 JSON 对象,因此它工作正常。我想避免仅为该边缘情况创建另一个 Execute 方法。
我已经开始做类似的事情,但它看起来有点老套。我觉得应该有一个更简单的方法来做到这一点
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);
}
}
我暂时用这个方法解决了这个问题。只有一种方法 returns 原始字符串。更好的解决方案仍然值得赞赏。
public T Deserialize<T>(IRestResponse response)
{
try
{
return JsonConvert.DeserializeObject<T>(response.Content);
}
catch
{
if (typeof(T) != typeof(SomeResponse))
{
throw;
}
response.Content = $"{{ \"Id\" : {response.Content} }}";
return JsonConvert.DeserializeObject<T>(response.Content);
}
}
另一个选择是这个
public T Deserialize<T>(IRestResponse response)
{
if (typeof(T) == typeof(SomeResponse))
{
response.Content = $"{{ \"Id\" : {response.Content} }}";
}
return JsonConvert.DeserializeObject<T>(response.Content);
}