如何使用 System.Text.Json 反序列化来自 RestSharp 的响应?

How to Deserialize response from RestSharp using System.Text.Json?

我正在尝试使用 RestSharp 编写简单的 Get 操作并尝试使用 System.Test.Json 反序列化响应。

我的测试方法如下,

    [Test]
    public  void Test1()
    {
        var restClient = new RestClient("http://localhost:3333/");

        var request = new RestRequest("posts/{postid}", Method.Get);

        request.AddUrlSegment("postid", 1);

        var response = restClient.ExecuteGetAsync(request).GetAwaiter().GetResult();

        var deserial = JsonSerializer.Deserialize<Posts>(response);
    }

Posts模型class如下,

public class Posts
{
    public string id { get; set; }
    public string title { get; set; }
    public string author { get; set; }
}

但我在行“var deserial = JsonSerializer.Deserialize(response);”

中收到强制错误

无法从 'RestSharp.RestResponse' 转换为 'System.Text.Json.JsonDocument' NUnitAPIPractice

如果我改成

var deserial = JsonSerializer.Deserialize<Posts>(response).ToSring();

然后编译问题就解决了,但是在我执行代码之后我得到了

    System.Text.Json.JsonException : 'R' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
      ----> System.Text.Json.JsonReaderException : 'R' is an invalid start of a value. LineNumber: 0 | BytePositionInLine: 0.
  Stack Trace: 
    ThrowHelper.ReThrowWithPath(ReadStack& state, JsonReaderException ex)

请告诉我是否必须使用特殊的 JSON 转换将 RestSharp 响应转换为 JSON 才能解决此问题?谢谢

您正在尝试反序列化整个 RESTSharp 响应对象,而不仅仅是它的 json 内容。

响应内容的字符串表示形式在响应变量的 Content 属性 中可用,请尝试反序列化它:

var deserial = JsonSerializer.Deserialize<Posts>(response.Content);

查看 restsharp 源代码,第 56 行: https://github.com/restsharp/RestSharp/blob/dev/src/RestSharp/Response/RestResponseBase.cs

RestSharp 将为您反序列化它。

var response = await restClient.ExecuteGetAsync<Posts>(request);
var deserialized = response.Data;

或者

var deserialized = await restClient.GetAsync<Posts>(request);

参考 documentation 总是一个好主意。