RestSharp 未正确反序列化 JSON
RestSharp not deserializing JSON correctly
我正在使用 RestSharp 来使用 REST Web 服务。我已经实现了自己的 Response 对象 classes 以与 RestSharp 中集成的自动 Serialization/Deserialization 一起使用。
我还添加了一个可以正常工作的带枚举的映射。
此 class 的问题在于,当我发送 正确的请求 时,我收到了 正确的响应 ,所以Response.Content 包含我所期望的内容,但反序列化过程无法正常工作。
Response.Content
{
"resultCode": "SUCCESS",
"hub.sessionId": "95864537-4a92-4fb7-8f6e-7880ce655d86"
}
ResultCode
属性 正确映射到 ResultCode.SUCCESS
枚举值但是 HubSessionId
属性 总是 null
所以看起来它没有被反序列化。
我看到的唯一可能的问题是 JSON PropertyName 带有“.”。在名字里。这可能是问题所在吗?这与不再是 Newtonsoft.Json 的新 JSON 序列化程序有关吗?我该如何解决?
更新
我发现 Json 属性被完全忽略了,[JsonConverter(typeof(StringEnumConverter))]
也是如此。因此我认为枚举映射是由默认的 Serializer 自动执行的,没有任何属性。
"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;
}
在 Newtonsoft 的 JSON.NET 案例中,使用自定义 JSON Serializer
和 Deserializer
解决。
我遵循了 Philipp Wagner 在 article 中解释的步骤。
我还注意到使用默认值 Serializer
的 Request
的序列化并没有像预期的那样使用枚举。它没有序列化枚举字符串值,而是放置了取自我的枚举定义的枚举 int 值。
现在 JSON.NET 序列化和反序列化过程可以正常工作。
我正在使用 RestSharp 来使用 REST Web 服务。我已经实现了自己的 Response 对象 classes 以与 RestSharp 中集成的自动 Serialization/Deserialization 一起使用。
我还添加了一个可以正常工作的带枚举的映射。
此 class 的问题在于,当我发送 正确的请求 时,我收到了 正确的响应 ,所以Response.Content 包含我所期望的内容,但反序列化过程无法正常工作。
Response.Content
{
"resultCode": "SUCCESS",
"hub.sessionId": "95864537-4a92-4fb7-8f6e-7880ce655d86"
}
ResultCode
属性 正确映射到 ResultCode.SUCCESS
枚举值但是 HubSessionId
属性 总是 null
所以看起来它没有被反序列化。
我看到的唯一可能的问题是 JSON PropertyName 带有“.”。在名字里。这可能是问题所在吗?这与不再是 Newtonsoft.Json 的新 JSON 序列化程序有关吗?我该如何解决?
更新
我发现 Json 属性被完全忽略了,[JsonConverter(typeof(StringEnumConverter))]
也是如此。因此我认为枚举映射是由默认的 Serializer 自动执行的,没有任何属性。
"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;
}
在 Newtonsoft 的 JSON.NET 案例中,使用自定义 JSON Serializer
和 Deserializer
解决。
我遵循了 Philipp Wagner 在 article 中解释的步骤。
我还注意到使用默认值 Serializer
的 Request
的序列化并没有像预期的那样使用枚举。它没有序列化枚举字符串值,而是放置了取自我的枚举定义的枚举 int 值。
现在 JSON.NET 序列化和反序列化过程可以正常工作。