VBA嵌套字典的反序列化
作者:Antoniothefuture
关键词:VBA、VB、字典、Dictionary、反序列化、嵌套
开发平台:VBE
平台版本上限:未知
平台版本下限:未知
开发语言:VBA
简介: 将表示VBA嵌套字典的字符串反序列化为字典对象。
我在《VBA嵌套字典的递归输出(序列化)》一文中,介绍了如何将VBA的嵌套字典进行序列化,输出字符串,这次我们来讨论一下如何将字符串反序列化到对象中:
还是以上文为例,有下面的一个字符串,需要转换为嵌套字典对象:
AllDic:
1:
Name:"王明"
BirthDate:"1990-01-01"
Horses:
1:
Addr:"中山路3号"
Price:"120万"
Rooms:
1:"客厅"
2:"主卧"
3,"厨房"
2:
Addr:"西安路58号"
Price:"90万"
Rooms:
1:"客厅"
2:"主卧"
3,"阳台"
2:
Name:"李红"
BirthDate:"1980-10-01"
Horses:
1:
Addr:"北京路159号"
Price:"145万"
Rooms:
1:"客厅"
2:"主卧"
3,"次卧1"
因为在上文我们已经规定了,使用换行符和Tab符来划分结构,所以在这里我们也用这些符号来帮助我们解构字符串。
在这里的关键是要判断每一行的类型,如果是键值对,就插入字符串对象,如果是字典,就新建一个子字典并插入,然后在后续判断层数,如果增加,就将本字典(ThisDic)链接到本字典的最后一个子字典,作为下一层的本字典,如果层数减少,就要重新层层遍历整个根字典。
来看看我的操作:
Function TexttoDic(T as String)
Dim DicArr() as String
Dim Line as String
Dim PreLine as String
Dim Lv as Integer
Dim PreLineLv as Integer
Dim RootDic as Object
Dim ThisDic as Object
Dim LeftStr as Object
Dim LeftStr
Dim RightStr as String
Dim LineArr() as String
Set RootDic = CreateObject("Scripting.Dictionary")
Set ThisDic = CreateObject("Scripting.Dictionary")
DicArr = Split(T,Chr(10))
'遍历字符串的每一行
For i = 0 to UBound(DicArr) - 1
Line = DicArr(i)
'用Tab字符判断层数
LineArr = Split(Line,Chr(9))
Lv = UBound(LineArr)
LeftStr = Split(LineArr(Lv),":")(0)
RightStr = Split(LineArr(Lv),":")(1)
If IsNumeric(LeftStr) Then
LeftStr = CInt(LeftStr)
End if
If i = 0 Then
'链接根字典
Set ThisDic = RootDic
If RightStr = "" Then
'这句很关键,用来创建子字典
ThisDic.Add LeftStr,CreateObject("Scripting.Dictionary")
Else
ThisDic.Add LeftStr,RightStr
End If
Else
'对比上一行的层数
PreLine = DicArr(i - 1)
LineArr = Split(PreLine,Chr(9))
PreLineLv = UBound(LineArr)
If Lv > PreLineLv Then
'如果层数增加,本字典为本字典的最后一个子字典
Key = ThisDic.keys
Set ThisDic = ThisDic(Key(UBound(Key)))
ElseIf Lv < PreLineLv Then
'如果层数减少,本字典重新递归(伪)查找
Set ThisDic = RootDic
If Lv > 0 then
For ii = 0 to Lv - 1
Key = ThisDic.leys
Set ThisDic = ThisDic(Key(UBound(Key)))
Next
End if
End If
If RightStr = "" Then
'插入普通对象
ThisDic.Add LeftStr,CreateObject("Scripting.Dictionary")
Else
'插入子字典
ThisDic.Add LeftStr,RightStr
End If
End If
Next
'到最后,RootDic即为结果对象,可自行处理
End Function