2015-03-27 4 views
2

Я пытаюсь десериализовать JSON в приложении Xamarin. Я много читал о, но все еще есть проблемы, так что, может быть, здесь кто-то может помочь:Deserialize JSON с RESTSharp C#

Мой ответ JSON-то вроде этого:

{ 
    "Events":[ 
      { 
       "id":7, 
       "name":"show", 
       "datefrom":"2012-01-01", 
       "timeto":"12:00:00", 
       "price":"3", 
       "imagen":"null", 
       "desc":"rock band playing", 
       "info":"Info about tickets", 
       "user":1, 
       "place":9, 
       "dateto":"2013-02-02", 
       "timeto":"12:30:00", 
       "Eventcategories":[] 
      }, 
      {"id":2, name:... 

Как я прочитал, я создал два класса, один для объекта (Event) и другие для ответа JSON (EventResponse) Второй имеет только список событий:

public class EventResponse 
{ 
    public ObservableCollection<Event> Events { get; set; } 
    public EventResponse(){ 
    } 
    } 
} 

и Event класс имеет все поля, возвращаемые в формате JSON:

private int _id; 
     public int id { 
      get { return _id; } 
      set { 

       _id = value; 
       OnPropertyChanged(); 
      } 
     } 

     private string _nombre; 
     public string nombre { 
      get { return _nombre; } 
      set { 
       if (value.Equals (_nombre, StringComparison.Ordinal)) 
        return; 
       _nombre = value; 
       OnPropertyChanged(); 
      } 
     }... 

После этого я хочу, чтобы мое приложение разбирало этот JSON, но единственное, что я могу получить, это строка, содержащая содержимое JSON.

var client = new RestClient("myip/api/events"); 
      var request = new RestRequest (Method.GET); 
      var asyncHandle = client.ExecuteAsync<EventResponse>(request, response => { 
      //Here I see the json result 
      string jsonString=response.Content; 
      //The same 
      Console.WriteLine(response.Content); 
      //Nothing is shown here 
      Console.WriteLine(response.Data.Events[0].id); 
      }); 

¿Может ли кто-нибудь дать мне некоторое представление о том, как я могу увидеть результат json? Я думаю, что следую соответствующим шагам, но после многих часов я ничего не могу достичь. Спасибо

ответ

4

Скорее всего сериализатор JSON не удается десериализации в объекты. Похоже, вы пытаетесь объединить VM и DTO в один класс, который IMO не очень хорошая идея. Держите DTO как можно проще. Если вы измените EventResponse на приведенный ниже код, можете ли вы получить объект?

public class Event 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string datefrom { get; set; } 
    public string timeto { get; set; } 
    public string price { get; set; } 
    public string imagen { get; set; } 
    public string desc { get; set; } 
    public string info { get; set; } 
    public int user { get; set; } 
    public int place { get; set; } 
    public string dateto { get; set; } 
    public List<object> Eventcategories { get; set; } 
} 

public class EventResponse 
{ 
    public List<Event> Events { get; set; } 
} 
+1

Это была проблема. Я делал модели вручную, я сделал это снова с помощью этого инструмента: http://json2csharp.com/, и теперь я могу разобрать его без каких-либо проблем. – ppardoz

+0

Эти инструменты тоже меня спасли. Отформатируйте C# справа, и это сработает! Благодарю. – Josh

2

Вам не хватает конечного этапа десериализации строки JSON. Вы можете использовать Json.net для десериализации строки для соответствующего объекта. Вы можете сделать это следующим образом:

var eventResponse = JsonConvert.DeserializeObject<EventResponse>(jsonString); 

Вот ссылка на Newtonsoft в Json.NET http://www.newtonsoft.com/json

+0

RestSharp включает в себя сериализатор JSON, так что это не корень проблемы. – SKall

+0

Чтобы сохранить ответ в текущем состоянии, я хотел бы указать, что с версии 103 RestSharp долго не содержит зависимости от JSON.Net от Newtonsoft. – BardMorgan

2

Это, как вы можете десериализации непосредственно в конкретной сущности/объекта с использованием Newtonsoft.Json.dll, который очень полезная библиотека и может быть установлена ​​из самородок. Подробнее вы можете найти по следующей ссылке: https://www.nuget.org/packages/Newtonsoft.Json/

userData = JsonConvert.DeserializeObject<GRALUserData>(response.Content, 
        new JsonSerializerSettings 
        { 
         PreserveReferencesHandling = PreserveReferencesHandling.Objects 
        }); 
+0

RestSharp включает в себя сериализатор JSON, так что это не корень проблемы. – SKall

+0

Чтобы сохранить ответ в данный момент, я хотел бы указать, что с версии 103 RestSharp долго не содержит зависимости от JSON.Net от Newtonsoft. – BardMorgan