2012-04-17 89 views
4

首先,我是所以對於提出有關JSON反序列化的另一個問題感到抱歉。不過,我還沒有看到答案。如何將JSON反序列化爲僅「內置」類型

我想反序列化JSON來T其中T遞歸定義爲:

  • Dictionary<string, T>
  • T[]
  • string
  • 原始類型
  • (object)T(盒裝)

我知道許多JSON庫允許指定反序列化類型,但根據我的經驗,某些自定義類型(JObjectJsonObject,無論什麼)顯示在對象圖的某處(即,返回類型似乎只是應用到一定的深度)。這似乎很直接,因爲類型幾乎與JavaScript一一對應。

編輯

理想情況下,我想的JSON是「乾淨的」,也就是說,沒有特殊領域(「__type」等)在反序列化幫助。它應該是JavaScript的簡單映射:JObject - >IDictionary<string, T>JArray - >T[],依此類推。

與此同時,我正在使用FParsec解析器和手動序列化器。它工作的很好,但我認爲可能已經有這方面的東西了。

+0

你有沒有試過Newtonsoft.JSON? (http://james.newtonking.com/pages/json-net.aspx)這是由ravenDB使用,我沒有問題在反序列化。 – wal 2012-04-17 23:32:10

+0

是的,這就是我目前使用的,而且'JObject'總是出現在深層嵌套的對象圖中。 – Daniel 2012-04-18 01:52:35

+1

你能提供一些示例代碼和輸入數據嗎? – Timmerz 2012-04-18 03:21:19

回答

0

我不太確定你的意思是「我想反序列化JSON到T,其中T被遞歸地定義爲」我的假設是你想能夠序列化和反序列化任何上面列出的類型和任何組合。

我的經驗表明,在System.Runtime.Serialization.Json提供的標準DOTNET的庫專門DataContractJsonSerializer是綽綽有餘爲你描述的工作,將成功應對所有你提到的(沒有元數據的描述)以外的類型,然後一個;一個T的盒裝對象。然而我的假設是沒有庫能夠處理T的盒裝對象而不提供元數據(它怎麼可能?它對你的對象一無所知)

這裏是一些代碼,我使用我的應用程序提供系列化

public class JSONSerializer<T> 
{ 

    public static string Serialize(T obj) 
    { 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
     using (MemoryStream stream = new MemoryStream()) { 
      serializer.WriteObject(stream, obj); 
      return Encoding.Default.GetString(stream.ToArray()); 
     } 
    } 

    public static T Deserialize(string json) 
    { 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
     using (MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(json))) { 
      return (T)serializer.ReadObject(stream); 
     } 
    } 

} 

PS:另外請注意,DataContractSerializer的做一個「純粹」的序列化和反序列化不使用任何代理類型的對象(至少不會在輸出或輸入,也許是內部某處)。

+0

我試圖序列化一個實現IDictionary 和它的barfs的類。它必須檢查運行時類型('this.GetType()')而不是'typeof(Dictionary )。IsAssignableFrom(type)'。 – Daniel 2012-04-18 21:59:44

-1

您不能使用泛型。這是因爲泛型必須在編譯時剝離爲單一類型。但是JSON對象或數組的值應該是任何JSON類型,並且是confict。

但是如果你想要的話,你可以使用object然後施放它。 JSON數組是object[],JSON對象是Dictionary<string,object>。但這只是您提到的自定義類型的變體。

相關問題