2013-01-21 22 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

基思没问题。如有必要,我很乐意详细介绍。 –

相关问题