2014-10-06 2 views
0

В настоящее время я работаю над приложением WinRT и самоорганизованным API в сервисе, служба, похоже, отлично работает.Json converting List cast error

Я работаю с json для передачи моих данных. У меня нет проблем с сериализацией экземпляра класса, который я хочу передать, но проблемы возникают, когда я хочу десериализатор.

Здесь класс:

public class DtoDirectory 
{ 
    public string Name { get; set; } 
    public string Path { get; set; } 
    public List<string> DirectoryIcon { get; set; } 
} 

Вот помощник я написал для управления JSON

public class SerializeHelper 
{ 
    public static T Deserialize<T>(string value) where T : class 
    { 
     try 
     { 
      var ret = JsonConvert.DeserializeObject<T>(value); 
      return ret; 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 
    } 

    public static string Serialize<T>(T type) where T : class 
    { 
     try 
     { 
      var output = JsonConvert.SerializeObject(type); 
      return output; 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

Вот данные, когда он приходит из API:

"[{"Name":"ANNONCES LEGALES","Path":"C:\\Test\\ANNONCES LEGALES","DirectoryIcon":["C:\\Test\\ANNONCES LEGALES\\fond.png","C:\\Test\\ANNONCES LEGALES\\icon.png"]},{"Name":"CONSEIL MUNICIPAL","Path":"C:\\Test\\CONSEIL MUNICIPAL","DirectoryIcon":["C:\\Test\\CONSEIL MUNICIPAL\\fond.png","C:\\Test\\CONSEIL MUNICIPAL\\icon.png"]},{"Name":"DIVERS","Path":"C:\\Test\\DIVERS","DirectoryIcon":["C:\\Test\\DIVERS\\fond.png","C:\\Test\\DIVERS\\icon.png"]},{"Name":"ELECTIONS","Path":"C:\\Test\\ELECTIONS","DirectoryIcon":["C:\\Test\\ELECTIONS\\fond.png","C:\\Test\\ELECTIONS\\icon.png"]},{"Name":"ETAT CIVIL","Path":"C:\\Test\\ETAT CIVIL","DirectoryIcon":["C:\\Test\\ETAT CIVIL\\fond.png","C:\\Test\\ETAT CIVIL\\icon.png"]},{"Name":"URBANISME","Path":"C:\\Test\\URBANISME","DirectoryIcon":["C:\\Test\\URBANISME\\fond.png","C:\\Test\\URBANISME\\icon.png"]}]" 

Наконец, ошибки:

{"Could not cast or convert from System.String to System.Collections.Generic.IList`1[DTO.DtoDirectory]."} 
Error converting value to type 'System.Collections.Generic.IList`1[DTO.DtoDirectory]'. Path '', line 1, position 1027. 

EDIT:

код, где я называю десериализатор:

try 
     { 
      var client = new HttpClient(); 
      var uri = new Uri("http://localhost:1234/api/document/ListDirectoryRoot?pathDirecory=C:\\Test\\Chasse"); 
      var request = new HttpRequestMessage(HttpMethod.Get, uri); 
      var res = await client.SendAsync(request); 
      var content = await res.Content.ReadAsStringAsync(); 
      var test = SerializeHelper.Deserialize<Wrapper >(lol); 
      return content; 
     } 
     catch (Exception) 
     { 
      return null; 
     } 

public class Wrapper 
{ 
    public List<DtoDirectory> list {get;set;} 
} 

Я, к сожалению, так и не удалось выяснить ошибку .. Спасибо за помощь!

+0

Можете вы добавить в свой вопрос код, в котором вы фактически используете/вызываете метод SerializeHelper? –

+0

А что такое 'Wrapper'? Не могли бы вы также разместить класс 'Wrapper'. – Michael

+0

Я вносил изменения;) – bottus

ответ

0

Вместо использования Wrapper используйте List<DtoDictionary>

var test = SerializeHelper.Deserialize<List<DtoDictionary>>(lol); 

После просмотра вашего Wrapper класса, я полагаю, если вы проверяете то, что было сообщение исключения на десериализации, вы увидите это

Не может десериализацию текущий массив JSON (например, [1,2,3]) в тип 'Wrapper', потому что для этого требуется объект JSON (например, {"name": "value"}) для десериализации. Чтобы исправить эту ошибку, изменит JSON на объект JSON (например, {"name": "value"}) или измените десериализованный тип на массив или тип, который реализует интерфейс (например, ICollection, IList), например Список, который может быть , десериализован из массива JSON. JsonArrayAttribute также можно добавить к типу, чтобы заставить его десериализоваться из массива JSON. Путь «», линия 1, позиция 1.

просто googling сообщений об исключении, первые 4 результатов были бы привели вас к SO подобных вопросов, на которые есть ответы, как решить эту проблему.

+0

В любом случае тот же тип должен использоваться для Deserialize(), который использовался при вызове Serialize(). – helb

+0

@michael я изменил, как вы сказали, но я все равно получаю ту же ошибку. – bottus

+0

@bottus Не могли бы вы проверить [.netfiddle] (https://dotnetfiddle.net/u0JiVs) и рассказать, в чем разница между вашим кодом и скрипка? – Michael

1

Я уверен, что JSON.NET в .NET 4.5 правильно преобразует значение, указанное вами в вашем вопросе.

Вот пример, где я могу получить его работу без проблем, когда я десериализации в List<DtoDirectory>:

var json = "[ { \"Name\": \"ANNONCES LEGALES\", \"Path\": \"C:\\\\Test\\\\ANNONCES LEGALES\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\ANNONCES LEGALES\\\\fond.png\", \"C:\\\\Test\\\\ANNONCES LEGALES\\\\icon.png\" ] }, { \"Name\": \"CONSEIL MUNICIPAL\", \"Path\": \"C:\\\\Test\\\\CONSEIL MUNICIPAL\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\CONSEIL MUNICIPAL\\\\fond.png\", \"C:\\\\Test\\\\CONSEIL MUNICIPAL\\\\icon.png\" ] }, { \"Name\": \"DIVERS\", \"Path\": \"C:\\\\Test\\\\DIVERS\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\DIVERS\\\\fond.png\", \"C:\\\\Test\\\\DIVERS\\\\icon.png\" ] }, { \"Name\": \"ELECTIONS\", \"Path\": \"C:\\\\Test\\\\ELECTIONS\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\ELECTIONS\\\\fond.png\", \"C:\\\\Test\\\\ELECTIONS\\\\icon.png\" ] }, { \"Name\": \"ETAT CIVIL\", \"Path\": \"C:\\\\Test\\\\ETAT CIVIL\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\ETAT CIVIL\\\\fond.png\", \"C:\\\\Test\\\\ETAT CIVIL\\\\icon.png\" ] }, { \"Name\": \"URBANISME\", \"Path\": \"C:\\\\Test\\\\URBANISME\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\URBANISME\\\\fond.png\", \"C:\\\\Test\\\\URBANISME\\\\icon.png\" ] } ]"; 
var ret = JsonConvert.DeserializeObject<List<DtoDirectory>>(json); 

Поскольку вы используете Wrapper класс в вашем примере я предполагаю, что у вас есть какой-то объект Упаковочный JSON окружая массив JSON в вашем примере.

В этом случае ваш JSON бы выглядеть следующим образом работать с классом Упаковочный:

var json = "{\"list\":[ { \"Name\": \"ANNONCES LEGALES\", \"Path\": \"C:\\\\Test\\\\ANNONCES LEGALES\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\ANNONCES LEGALES\\\\fond.png\", \"C:\\\\Test\\\\ANNONCES LEGALES\\\\icon.png\" ] }, { \"Name\": \"CONSEIL MUNICIPAL\", \"Path\": \"C:\\\\Test\\\\CONSEIL MUNICIPAL\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\CONSEIL MUNICIPAL\\\\fond.png\", \"C:\\\\Test\\\\CONSEIL MUNICIPAL\\\\icon.png\" ] }, { \"Name\": \"DIVERS\", \"Path\": \"C:\\\\Test\\\\DIVERS\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\DIVERS\\\\fond.png\", \"C:\\\\Test\\\\DIVERS\\\\icon.png\" ] }, { \"Name\": \"ELECTIONS\", \"Path\": \"C:\\\\Test\\\\ELECTIONS\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\ELECTIONS\\\\fond.png\", \"C:\\\\Test\\\\ELECTIONS\\\\icon.png\" ] }, { \"Name\": \"ETAT CIVIL\", \"Path\": \"C:\\\\Test\\\\ETAT CIVIL\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\ETAT CIVIL\\\\fond.png\", \"C:\\\\Test\\\\ETAT CIVIL\\\\icon.png\" ] }, { \"Name\": \"URBANISME\", \"Path\": \"C:\\\\Test\\\\URBANISME\", \"DirectoryIcon\": [ \"C:\\\\Test\\\\URBANISME\\\\fond.png\", \"C:\\\\Test\\\\URBANISME\\\\icon.png\" ] } ]}"; 
var ret = JsonConvert.DeserializeObject<Wrapper>(json); 

Что я заподозрить в том, что класс-оболочка не отражает правильно структуру JSON, что вы получить от веб-службы. Поэтому вы должны проверить точную структуру JSON и создать класс Wrapper, который будет правильно представлять иерархию объектов JSON.