当响应是原始字符串时无法反序列化 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);
}