【问题标题】:Cannot deserialize Restsharp response when the response is a raw string当响应是原始字符串时,无法反序列化 Restsharp 响应
【发布时间】: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


【解决方案1】:

我现在已经用这种方法解决了这个问题。只有一种方法返回原始字符串。仍然感谢更好的解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多