Json转换List强制转换错误

时间:2014-10-06 08:45:08

标签: c# list json.net deserialization

我目前正在研究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;}
 }

我很遗憾没有成功找出错误.. 谢谢你的帮助!

2 个答案:

答案 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个结果会让您找到类似的问题,这些问题可以解答如何解决问题。