2016-06-03 2 views
1

У меня возникли проблемы с десериализацией Json, который возвращает api.Deserialize Json to List C#

Json является следующее:

{ "Result":[ 
    { 
     "Id": 1, 
     "Type": "Type1" 
    }, 
    { 
     "Id": 2, 
     "Type": "Type2" 
    } 
]} 

Я пытаюсь десериализации его в список этого типа:

public class ContactType 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
} 

ReturnType используется ниже: Список < ContactType> и функция GetContactTypes называется следующим образом:

var test = await _items.GetContactTypes<List<ContactType>>(AuthToken.access_token); 

Используя этот код:

public async Task<ReturnType> GetContactTypes<ReturnType>(string access_token) 
    { 
     try 
     { 
      Header = string.Format("Bearer {0}", access_token); 
      client.DefaultRequestHeaders.Add("Authorization", Header); 

      HttpResponseMessage response = await client.GetAsync(base_url + "contacttypes"); 

      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       return JsonConvert.DeserializeObject<ReturnType>(await response.Content.ReadAsStringAsync()); 
      } 
      else 
      { 
       return default(ReturnType); 
      } 
     } 
     catch (Exception ex) 
     { 
      return default(ReturnType); 
     } 
    } 

Но я всегда получаю эту ошибку:

Не можете десериализации объекта тока JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1', потому что для десериализации правильно требуется массив JSON (например, [1,2,3]).

Любая помощь приветствуется, спасибо.

+0

Если вы создаете классы C# для этого JSON по адресу http://json2csharp.com/, вы увидите, что он создает два класса: 'Result' и' RootObject'.Ваш код не работает, потому что он пытается десериализовать JSON, чтобы напечатать 'List ', когда он действительно имеет тип RootObject с содержащим 'List ' – adaam

ответ

2

Объект, который вы пытаетесь десериализовать, имеет одно свойство Result, содержащее массив ContactType - у вас его нет в вашей объектной модели. Попробуйте десериализации к этому объекту:

public class MyClass // give this a more meaningful name 
{ 
    public List<ContactType> Result{ get; set; } 
} 

public class ContactType 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
} 

, а затем:

... 
var test = await _items.GetContactTypes<MyObject>(AuthToken.access_token); 
... 
+0

. Это сделал трюк, спасибо :) –

1

Вы, наверное, нужен класс-обертку для этого, так как объект JSON является не только сам массив, но с узлом "Result" со значением этого массива.

public class ContactResult 
{ 
    public List<ContactType> Result {get; set;} 
} 

А затем вызовите ваш метод с этим классом упаковщика:

var test = await _items.GetContactTypes<ContactResult>(AuthToken.access_token); 
+0

Это сделало трюк, спасибо :) –

1

Если вы генерировать C# классы для этого JSON в json2csharp.com вы увидите, что он создает два класса: ContactType и RootObject:

public class ContactType 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
} 

public class RootObject 
{ 
    public List<ContactType> Result { get; set; } 
} 

Ваш код не удается, потому что он пытается десериализации JSON к типу List<ContactType>, когда он на самом деле типа RootObject с содержащей список.

Так что, если вы десериализация типу RootObject первые так:

JsonConvert.DeserializeObject<RootObject>(str) 

Вы можете получить доступ к списку внутри десериализованному RootObject объекта.

+0

Как оба предыдущих ответа, это сделало трюк :) Спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^