2013-07-09 56 views
0

这可能是愚蠢的/过于复杂/几乎是不可能的键和值,但是......递归打印一个Hashtable,包括哈希表和的ArrayList

我有一个JSON文件。我使用C#类(http://bit.ly/1bl73Ji)将文件解析到HashTable中。

所以,我现在有一个HashTable。这个HashTable有键和值。但是,其中一些值是ArrayLists或HashTables。有时这些ArrayLists包含HashTables,有时HashTables包含Hashtables,等等等等等等......

我基本上只是试图将这些键和值打印到文件中,只是使用简单的缩进来区分,例如,

dateLastActivity 
    2013-07-01T13:50:51.746Z 
members 
    memberType 
     normal 
    avatarHash 
     5f9a6a60b6e669e81ed3a886ae 
    confirmed 
     True 
    status 
     active 
    url 
     www.awebsite.com 
    id 
     4fcde962a1b057c46607c1 
    initials 
     AP 
    username 
     ap 
    fullName 
     A Person 
    bio 
     Software developer 

我需要recursivley经过哈希表,检查是否值是一个ArrayList或哈希表,并保持检查和检查,直到它只是一个字符串值。我对它有过一次破解,但我似乎无法围绕递归进行思考。

任何人都可以帮忙吗?即使有人能想到更好的办法,或者我应该放弃希望,我也想听到它!

在此先感谢!

回答

1

有针对

老实说,我只想用Json.NET图书馆,这就是我使用几乎所有我的项目来处理我的JSON,它是不断更新和运作非常良好。

如果你想要一个易于人类读取的文件格式,序列化(序列化意味着转换成数据表示形式)数据并稍后进行人工编辑,这也很好。它具有序列化几乎大部分对象开箱即用的功能。

对于大多数对象,你所要做的就是将这个语句序列化为一个字符串。


string s = JsonConverter.Serialize(theObject); 
//assume you have a write file method 
WriteFile(filename, s); 

这就是它在大多数情况下,序列化和反序列化也很容易


string content = ReadFile(filename); 
MyObject obj = JsonConverter.Deserialize(content); 

库还包括匿名对象的支持,允许你指定你的对象是如何解析与属性,其他很多很酷的功能,同时还快于内置的.NET版本

1

伪代码答案:

main(){ 
recurse(0, myHashTable) 
} 

recurse(int level, Structure tableOrArray){ 
    for element x in tableOrArray{ 
      if(x is a string) print (level)*indent + x; 
      if(x is not a string) recurse(level + 1, x) 
    } 
}