2016-07-26 4 views
1

Я использую 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; 
} 
+0

'.' в имени свойства никогда не было проблемой для newtonsoft json. Я могу сказать это, потому что самые старые и последние версии обеих версий отлично работают с вами образцом JSON. Смотрите скрипку. https://dotnetfiddle.net/i0zmc0 Использует v3.5.x. Вы также можете попробовать 8.x. – niksofteng

+0

Я добавлю несколько подробностей о моем коде. –

+0

'JsonProperty' - это атрибут Json.NET. Если сериализатор не Json.NET, атрибут JsonProperty будет проигнорирован. Каков эквивалентный атрибут для * нового * сериализатора? –

ответ

2

решаемые с помощью пользовательского JSON Serializer и Deserializer, в случае Newtonsoft в Json.NET. Я выполнил шаги, описанные в этом article Филиппом Вагнером.

Я также заметил, что сериализация Request по умолчанию Serializer не работает должным образом с перечислениями. Вместо сериализации значения строки перечисления он помещает значение enum int, взятое из моего определения перечисления.

С JSON.NET теперь процессы сериализации и десериализации работают правильно.