2014-10-06 85 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類。