VBA嵌套字典的反序列化

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
		

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值