Я использую RestSharp для использования веб-службы REST. Я применил свои собственные классы объектов Response для использования с автоматической сериализацией/десериализацией, встроенной в RestSharp.RestSharp не десериализует JSON правильно
Я также добавил mappping с перечислениями, которые работают правильно.
Проблема с этим классом является то, что, когда я посылаю правильный запрос я получить обратно правильный ответ, поэтому Response.Content содержит то, что я ожидал, но процесс десериализации не работает правильно.
Response.Content
{
"resultCode": "SUCCESS",
"hub.sessionId": "95864537-4a92-4fb7-8f6e-7880ce655d86"
}
Свойства ResultCode
правильно отображается в ResultCode.SUCCESS
значение перечислимого но HubSessionId
свойства всегда null
так кажется, что это не десериализации.
Единственная возможная проблема, которую я вижу, это JSON PropertyName с символом '.' во имя. Это может быть проблема? Связано ли это с новым JSON Serializer, который не является Newtonsoft.Json больше? Как я могу это решить?
UPDATE
я обнаружил, что атрибуты 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. Я могу сказать это, потому что самые старые и последние версии обеих версий отлично работают с вами образцом JSON. Смотрите скрипку. https://dotnetfiddle.net/i0zmc0 Использует v3.5.x. Вы также можете попробовать 8.x. – niksofteng
Я добавлю несколько подробностей о моем коде. –
'JsonProperty' - это атрибут Json.NET. Если сериализатор не Json.NET, атрибут JsonProperty будет проигнорирован. Каков эквивалентный атрибут для * нового * сериализатора? –