2014-10-06 81 views
0

我目前正在从事WinRT应用程序和API自服务,该服务似乎很好。Json转换列表铸造错误

我正在使用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. 

编辑:

这里我所说的解串器的代码:

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方法的代码吗? – 2014-10-06 09:02:39

+0

什么是“包装”?你能不能也请发贴'Wrapper'类。 – Michael 2014-10-06 09:08:21

+0

我做了更改;) – bottus 2014-10-06 09:11:33

回答

0

而不是使用Wrapper的,使用List<DtoDictionary>

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

看到您的Wrapper下课后,我想如果你检查什么是对反序列化异常消息,你会看到这个

不能反序列化当前的JSON数组(例如[1,2,3])转换为 'Wrapper'类型,因为该类型需要JSON对象(例如 {“name”:“value”})才能正确地反序列化。要修正这个错误,要么将更改为JSON对象(例如{“name”:“value”}),要么将反序列化类型更改为实现集合的数组或类型,例如ICollection,IList列表可以是从JSON数组反序列化的 。 JsonArrayAttribute也可以添加 以强制它从JSON数组反序列化。路径', 1号线,位置1

只需googling异常消息,第4分的结果会导致你有答案,如何解决问题,让类似的问题。

+0

在任何情况下,必须使用与Serialize()调用时所用的Deserialize()相同的类型。 – helb 2014-10-06 09:21:53

+0

@ michael我改变了你说的,但我仍然得到相同的错误.. – bottus 2014-10-06 09:47:07

+0

@bottus你可以请检查[.netfiddle](https://dotnetfiddle.net/u0JiVs)并告诉你的代码和小提琴? – Michael 2014-10-06 10:32:03

1

我很确定.NET 4.5中的JSON.NET会正确地转换您在问题中指定的值。

下面是一个例子,我可以得到它没有问题的工作时,我反序列化到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结构,你是从Web服务中获得。因此,您应该检查确切的JSON结构并构建一个能够正确表示对象的JSON层次结构的Wrapper类。