Json转换列表强制转换错误



我目前正在开发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;}
 }

不幸的是,我没能找出错误。。谢谢你的帮助!

我非常确信.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层次结构。

不要使用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。

通过简单地在谷歌上搜索异常消息,前4个结果会让你找到非常相似的问题,这些问题都有如何解决问题的答案。

相关内容

  • 没有找到相关文章

最新更新