2014-09-09 1 views
1

У меня здесь странная проблема с JSON. Я вызываю веб-службу REST из своего кода на C#, используя RestSharp (v104.4), и вызов работает нормально.RestSharp не может автоматически автоматически десериализовать мой ответ JSON, но JSON.NET может - почему?

Проблема с возвратом JSON - если я разрешу RestSharp «автоматически» декодировать его - он не работает. Если я десериализую JSON, я возвращаюсь вручную, используя JSON.NET, он работает отлично. Зачем?

Мой запрос RestSharp:

RestRequest request = new RestRequest(MyUrl, Method.GET); 
request.AddHeader("Authorization", "Bearer " + token); 

IRestResponse<JsonResponse> response = _restClient.Execute<JsonResponse>(request); 

Это сырье JSON я вернусь из этого разговора:

{ "roomURL":"https://dev.mycompany.com/room/abc123", "text":"Click here. ....." } 

Используя этот класс, я пытаюсь иметь RestSharp автоматически десериализации этот ответ:

public class JsonResponse { 
    public string RoomUrl { get; set; } 
    public string Text { get; set; } 
} 

Но использование RestSharp - response.Data У меня есть null Значение для RoomUrl.

Однако, если я использую Json.NET вручную преобразовали ответ в JsonResult, обе части информации (RoomUrl и Text) не распознан - никаких проблем вообще.

var result = JsonConvert.DeserializeObject<JsonResponse>(response.Content); 

Здесь result.RoomUrl получает возвращенный URL без каких-либо помех.

Я просто немного озадачен, почему RestSharp неправильно десериализует JSON, возвращенный в объект JsonResponse - любые идеи?

Я также попытался положить [JsonProperty("roomURL")] на строку RoomUrl в JsonResponse - но это не имеет никакого значения, похоже.

ответ

3

Проблема была решена после публикации в группе RestSharp Google.

RestSharp с v103 больше не использует JSON.NET, но его собственный десериализатор JSON - который обрабатывает некоторые вещи несколько иначе.

Название roomURL в ответ JSON меня не быть автоматически «взял» в десериализатор RestSharp JSON - но с использованием атрибута DeserializeAs в моем классе ответа решается вопрос:

public class JsonResponse { 
    [DeserializeAs(Name = "roomURL")] 
    public string RoomUrl { get; set; } 
    public string Text { get; set; } 
} 

Теперь Ответ JSON по моей просьбе автоматически десериализуется, как и ожидалось, и я могу использовать его.

Благодаря Эндрю Яну в группе RestSharp Google для решения этой проблемы!

+0

так что десеррилизатор restsharp ожидает, что свойства начнутся с нижнего регистра? – ps2goat

+0

restsharp deserializer не будет отображать сопоставление между 'RoomUrl' и' roomURL', потому что он не следует этим правилам отображения в wiki: https://github.com/restsharp/RestSharp/wiki/Deserialization –