2015-05-21 5 views
2

Эй и спасибо заранее!Deserializing данных JSON (массив) на C# с использованием JSON.NET

Я пытаюсь десериализации WebAPI JSon, но изо всех сил на получение массива (список?)

У меня есть этот JSon от WebAPI, которые я не могу изменить.

{ 
    "Id": "83eb701d-c280-4d39-8333-29e574898b07", 
    "UserName": "silver", 
    "Joined": "2015-05-14T18:42:55.14", 
    "UserListedBookDtos": [ 
    { 
     "ISBN": "9780553897845", 
     "Title": "A Game of Thrones", 
     "Description": "A NEW ORIGINAL SERIES.....", 
     "Length": 720, 
     "Author": "George R.R. Martin", 
     "Status": 0 
    } 
    ] 
} 

Теперь я пытаюсь десериализации его с этим:

 public static async Task RunAsyncGetUserBooks() 
     { 
      using (var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri("https://localhost:44300/"); 
       var response = await client.GetAsync("api/users/"+Login.UsName+""); 

       if (response.IsSuccessStatusCode) 
       { 
        var result = await response.Content.ReadAsAsync<UserBooksResponse>(); 
        MessageBox.Show(result.Id); 
       } 
       else 
       { 
        MessageBox.Show("Something went wrong!"); 
       } 
      } 
     } 

Для классов я использую эти два:

 public class UserListedBookDtos 
     { 

      [JsonProperty(PropertyName = "ISBN")] 
      public int ISBN { get; set; } 

      [JsonProperty(PropertyName = "Title")] 
      public string Title { get; set; } 

      [JsonProperty(PropertyName = "Description")] 
      public string Description { get; set; } 

      [JsonProperty(PropertyName = "Length")] 
      public int Length { get; set; } 

      [JsonProperty(PropertyName = "Author")] 
      public string Author { get; set; } 

      [JsonProperty(PropertyName = "Status")] 
      public int Status { get; set; } 

     } 

     public class UserBooksResponse 
     { 
      [JsonProperty(PropertyName = "Id")] 
      public string Id { get; set; } 

      [JsonProperty(PropertyName = "UserName")] 
      public string UserName { get; set; } 

      [JsonProperty(PropertyName = "Joined")] 
      public string Joined { get; set; } 

      [JsonProperty(PropertyName = "UserListedBookDtos")] 
      public IList<UserListedBookDtos> UserListedBookDtos { get; set; } 

     } 

Однако я не могу показаться, чтобы получить какую-либо информацию от сервер, что было когда-либо, когда включена часть списка UserBooksResponse. Однако, если я прокомментирую эту часть:

 [JsonProperty(PropertyName = "UserListedBookDtos")] 
     public IList<UserListedBookDtos> UserListedBookDtos { get; set; } 

Я получаю Id, UserName и без проблем. Я довольно новичок в C# и не могу понять, что вызывает это. Я был бы очень признателен всем, кто мог бы либо сообщить мне, почему он не извлекает ничего с сервера, пока список включен, или что мне делать, чтобы получить данные из списка.

UPDATE

Я нашел ответ на мой первый вопрос, как и почему я не извлекаться никакой информации вообще. Это было вызвано тем, что мой ISBN был int, а не строкой, как и должно было быть. Спасибо за отзыв отладчика!

+1

Вы попробовали Список <...>, вместо IList <...>? – javorosas

+0

Также попробуйте прокомментировать каждое из ваших свойств вашего класса UserListedBookDtos, чтобы проверить, действительно ли проблема связана с массивом или только одним свойством класса в массиве – javorosas

+1

. Попробуйте использовать отладчик и шаг за шагом введите свой код проверьте значения – sceiler

ответ

3

Проблема заключается в том, что вы отображаете свойство ISBN как int, но значение 9780553897845 слишком велико для 32-разрядного целого. Он может поместиться в long (Int64), но вы должны, вероятно, сопоставить его как string, потому что это не действительно номер (это идентификатор, который просто делается только из цифр).

+0

Спасибо за ответ, и действительно, это было виновником моей первой проблемы, мне удалось исправить это несколько секунд назад. Моя вторая стена все еще вверх, хотя, похоже, не находит способ сохранить информацию из самого массива. Я думаю, что это связано с тем, что я не сохраняю информацию должным образом в var result = wait response.Content.ReadAsAsync (); Или информация не получена вообще. – svanamet

+0

@svanamet, я не понимаю, что вы имеете в виду. Я попытался десериализировать ваш образец JSON, используя ваши классы (с исправлением на ISBN), и он отлично работает. Что не работает точно? –

+0

Я пытаюсь получить информацию из списка , как Title, Decription, length, Author и Status в Datagridview, но поля отображаются пустым. Я думаю, что я должен либо десериализировать это неправильно, либо мое datagridview настроено плохо. – svanamet