我目前正在研究WinRT应用程序以及在服务中托管的API,该服务似乎运行良好。
我正在与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 :(得分: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数组的Wrapper JSON对象。
在这种情况下,您的JSON必须如下所示才能使用Wrapper类:
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);
我怀疑这里的包装类没有正确反映您从Web服务获得的JSON结构。因此,您应该检查确切的JSON结构并构建一个Wrapper类,它将正确表示对象的JSON层次结构。
答案 1 :(得分: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)就像List一样 从JSON数组反序列化。也可以添加JsonArrayAttribute 到类型强制它从JSON数组反序列化。路径'', 第1行,第1位。
通过简单的googling异常消息,前4个结果会让您找到类似的问题,这些问题可以解答如何解决问题。