RestSharp无法正确反序列化JSON

问题描述:

我正在使用RestSharp来使用REST Web服务。我已经实现了自己的Response对象类,用于在RestSharp中集成的自动序列化/反序列化。RestSharp无法正确反序列化JSON

我也添加了一个映射与枚举,正常工作。

这一类的问题是,当我发送一个正确的请求我得到一个正确的响应,所以Response.Content包含我所期望的,但反序列化过程中不能正常工作。

Response.Content

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

ResultCode属性是正确映射到ResultCode.SUCCESS枚举值,但HubSessionId属性始终是null所以看起来它不反序列化。

我看到的唯一可能的问题是带有'。'的JSON PropertyName。在名字里。这可能是问题吗?这是否与不是Newtonsoft.Json的新JSON序列化程序相关?我该如何解决它?

UPDATE

我发现,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; 
} 
+0

'。'在属性名称中从来不是Newtonsoft json的问题。我可以这样说,因为最老的和最新的两个版本都可以与你的JSON样本一起工作。看小提琴。 https://dotnetfiddle.net/i0zmc0它使用v3.5.x.你也可以试试8.x。 – niksofteng

+0

我会添加一些关于我的代码的更多细节。 –

+0

'JsonProperty'是一个Json.NET属性。如果序列化程序不是Json.NET,则JsonProperty属性将被忽略。 * new * serializer的等价属性是什么? –

解决使用自定义JSON SerializerDeserializer,在案件Newtonsoft的JSON.NET。 我遵循Philipp Wagner在article中解释的步骤。

我还注意到使用默认SerializerRequest的序列化不像预期的使用枚举。不是序列化枚举字符串值,而是从我的枚举定义中获取枚举int值。

现在,使用JSON.NET,序列化和反序列化过程能够正常工作。