2013-01-21 49 views
0

我想有效地反序列化包含JSON對象的嵌套數組的JSON對象。如何在C#中使用流讀取器有效地反序列化帶有嵌套對象的JSON對象?

例如,JSON目錄列表可能包含具有遞歸數組文件系統對象的根JSON文件系統對象。

{ 
    "bytes": 0, 
    "path": "/Public", 
    "is_dir": true, 
    "contents": [ 
     { 
      "bytes": 0, 
      "modified": "Mon, 18 Jul 2011 20:13:43 +0000", 
      "path": "/Public/1.txt", 
      "is_dir": false 
     }, 
     { 
      "bytes": 0, 
      "modified": "Mon, 18 Jul 2011 20:13:43 +0000", 
      "path": "/Public/2.txt", 
      "is_dir": false 
     } 
    ] 
} 

相應的C#類將是這個樣子

class JsonFileInfo 
{ 
    public string Path; 
    public long Bytes; 
    public string Modified; 
    public bool IsDir; 
    public List<JsonFileInfo> Contents; 
} 

我嘗試了.NET DataContractJsonSerializer例如

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(RainstormFileInfo)); 
JsonFileInfo jfi = (JsonFileInfo)serializer.ReadObject(responseStream); 

我也試過了JSON.NET JsonSerializer + JsonTextReader,例如

JsonReader reader = new JsonTextReader(new StreamReader(responseStream)) 
JsonSerializer serializer = new JsonSerializer(); 
JsonFileInfo jfi = serializer.Deserialize<JsonFileInfo>(reader); 

但兩個框架讀取整個contents JSON子陣列到內存在反序列化一舉。

如何從一個JsonFileInfo對象流中讀取此JSON結果?

+0

當你高效地說你是什麼意思?最短的時間?最少的資源?最少的代碼行?每個人都可以有不同的解決方案 – RhysW

+0

我認爲你必須編寫一個定製的de/serializer –

+0

好點。我的意思是儘可能少的內存佔用。這就是爲什麼我不想一次將整個結構讀入內存的原因。 –

回答

0

現在有一個圖書館可以做你正在尋找什麼。它將一次讀取一個字節的JSON並返回結果。完整的描述和使用示例here

它可以讓你避免重新發明車輪。

本質上,該庫允許您解析完整的JSON對象,或者定位嵌套對象。無論哪種情況,這都是解析JSON的一種非常有效的方式,並且比JSON.NET更快。

+0

這就是我一直在尋找的那種圖書館。 –

+0

基思沒問題。如有必要,我很樂意詳細介紹。 –

相關問題