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;
}
答
解决使用自定义JSON Serializer
和Deserializer
,在案件Newtonsoft的JSON.NET。 我遵循Philipp Wagner在article中解释的步骤。
我还注意到使用默认Serializer
的Request
的序列化不像预期的使用枚举。不是序列化枚举字符串值,而是从我的枚举定义中获取枚举int值。
现在,使用JSON.NET,序列化和反序列化过程能够正常工作。
'。'在属性名称中从来不是Newtonsoft json的问题。我可以这样说,因为最老的和最新的两个版本都可以与你的JSON样本一起工作。看小提琴。 https://dotnetfiddle.net/i0zmc0它使用v3.5.x.你也可以试试8.x。 – niksofteng
我会添加一些关于我的代码的更多细节。 –
'JsonProperty'是一个Json.NET属性。如果序列化程序不是Json.NET,则JsonProperty属性将被忽略。 * new * serializer的等价属性是什么? –