RestSharp 未正确反序列化 JSON

本文关键字:反序列化 JSON RestSharp | 更新日期: 2023-09-27 17:58:43

我正在使用RestSharp来使用REST Web服务。我已经实现了自己的响应对象类,以与 RestSharp 中集成的自动序列化/反序列化一起使用。

我还添加了一个带有正常工作的枚举的映射。

此类的问题在于,当我发送正确的请求时,我得到正确的响应,因此 Response.Content 包含我期望的内容,但反序列化过程无法正常工作。

响应.内容

{
    "resultCode": "SUCCESS",
    "hub.sessionId": "95864537-4a92-4fb7-8f6e-7880ce655d86"
}

ResultCode 属性正确映射到ResultCode.SUCCESS枚举值,但 HubSessionId 属性始终null因此看起来没有反序列化。

我看到的唯一可能的问题是名称中带有"."的 JSON 属性名称。会不会是问题所在?这是否与不再是Newtonsoft.Json的新JSON序列化程序有关?我该如何解决?

更新

我发现 Json 属性被完全忽略了,[JsonConverter(typeof(StringEnumConverter))]也是如此。因此,我认为枚举映射是由默认序列化程序自动执行的,没有任何属性。"hub.sessionId"属性的问题仍然存在。

这是我的代码

public class LoginResponse
{
    [JsonProperty(PropertyName = "resultCode")]
    [JsonConverter(typeof(StringEnumConverter))]
    public ResultCode ResultCode { get; set; }
    [JsonProperty(PropertyName = "hub.sessionId")]
    public string HubSessionId { get; set; }
}
public enum ResultCode
{
    SUCCESS,
    FAILURE
}
// Executes the request and deserialize the JSON to the corresponding
// Response object type.
private T Execute<T>(RestRequest request) where T : new()
{
    RestClient client = new RestClient(BaseUrl);
    request.RequestFormat = DataFormat.Json;
    IRestResponse<T> response = client.Execute<T>(request);
    if (response.ErrorException != null)
    {
        const string message = "Error!";
        throw new ApplicationException(message, response.ErrorException);
    }
    return response.Data;
}
public LoginResponse Login()
{
    RestRequest request = new RestRequest(Method.POST);
    request.Resource = "login";
    request.AddParameter("username", Username, ParameterType.GetOrPost);
    request.AddParameter("password", Password, ParameterType.GetOrPost);
    LoginResponse response = Execute<LoginResponse>(request);
    HubSessionId = response.HubSessionId; // Always null!
    return response;
}

RestSharp 未正确反序列化 JSON

使用自定义 JSON SerializerDeserializer 求解,在 Newtonsoft JSON.NET 的情况下。我按照菲利普·瓦格纳(Philipp Wagner(在本文中解释的步骤进行操作。

我还注意到,使用默认SerializerRequest进行序列化与枚举的预期不符。它不是序列化枚举字符串值,而是放置枚举 int 值,取自我的枚举定义。

现在有了 JSON.NET 序列化和反序列化过程就可以正常工作。

如今,RestSharp 中的默认 JSON 序列化程序使用 System.Text.Json ,这是 .NET 6 以来 .NET 的一部分。因此,您现在可以简单地使用属性JsonPropertyName来修饰 DTO 类中的属性。

下面是 DTO 类的示例:

using System.Text.Json.Serialization;
public class FacebookAuthResponse
{
    [JsonPropertyName("access_token")]
    public string AccessToken { get; set; } = null!;
    [JsonPropertyName("token_type")]
    public string TokenType { get; set; } = null!;
    [JsonPropertyName("expires_in")]
    public int ExpiresIn { get; set; }
}

下面是如何发出请求和反序列化的示例:

using RestSharp;
public class FacebookAuthService : IFacebookAuthService
{
    readonly string _clientId;
    readonly string _clientSecret;
    readonly string _redirectUri;
    readonly RestClient _client;
    public FacebookAuthService(string clientId, string clientSecret, string redirectUri)
    {
        _clientId = clientId;
        _clientSecret = clientSecret;
        _redirectUri = redirectUri;
        _client = new RestClient("https://graph.facebook.com/v16.0");
    }
    public FacebookAuthResponse? GetAccessToken(string code)
    {
        var request = new RestRequest("oauth/access_token", Method.Get);
        request.AddParameter("client_id", _clientId);
        request.AddParameter("client_secret", _clientSecret);
        request.AddParameter("redirect_uri", _redirectUri);
        request.AddParameter("code", code);
        var response = _client.Execute<FacebookAuthResponse>(request);
        return response.Data;
    }
}

请注意,客户端只是像这样实例化:

new RestClient("https://graph.facebook.com/v16.0")

请求在上面的代码中是这样发出的:

_client.Execute<FacebookAuthResponse>(request);

无需定义任何自定义序列化程序/反序列化程序。