我有同样的问题Excel VBA:解析的 JSON 对象循环但找不到任何解决方案。我的 JSON 具有嵌套对象,因此建议的解决方案(如 VBJSON 和 vba-json)对我不起作用。我还修复了其中一个使其正常工作,但结果是由于 doProcess 函数的多次递归而导致调用堆栈溢出。
最好的解决方案似乎是原始帖子中看到的 jsonDecode 函数。速度非常快,效率很高;我的对象结构全部位于 JScriptTypeInfo 类型的通用 VBA 对象中。
此时的问题是我无法确定对象的结构是什么,因此,我事先不知道每个通用对象中将驻留的键。我需要循环遍历通用 VBA 对象来获取键/属性。
如果我的解析 javascript 函数可以触发 VBA 函数或子函数,那就太好了。
如果你想建立在ScriptControl
,您可以添加一些辅助方法来获取所需的信息。这JScriptTypeInfo
对象有点不幸:它包含所有相关信息(正如您在Watch窗口),但用 VBA 似乎不可能得到它。然而,Javascript 引擎可以帮助我们:
Option Explicit
Private ScriptEngine As ScriptControl
Public Sub InitScriptEngine()
Set ScriptEngine = New ScriptControl
ScriptEngine.Language = "JScript"
ScriptEngine.AddCode "function getProperty(jsonObj, propertyName) { return jsonObj[propertyName]; } "
ScriptEngine.AddCode "function getKeys(jsonObj) { var keys = new Array(); for (var i in jsonObj) { keys.push(i); } return keys; } "
End Sub
Public Function DecodeJsonString(ByVal JsonString As String)
Set DecodeJsonString = ScriptEngine.Eval("(" + JsonString + ")")
End Function
Public Function GetProperty(ByVal JsonObject As Object, ByVal propertyName As String) As Variant
GetProperty = ScriptEngine.Run("getProperty", JsonObject, propertyName)
End Function
Public Function GetObjectProperty(ByVal JsonObject As Object, ByVal propertyName As String) As Object
Set GetObjectProperty = ScriptEngine.Run("getProperty", JsonObject, propertyName)
End Function
Public Function GetKeys(ByVal JsonObject As Object) As String()
Dim Length As Integer
Dim KeysArray() As String
Dim KeysObject As Object
Dim Index As Integer
Dim Key As Variant
Set KeysObject = ScriptEngine.Run("getKeys", JsonObject)
Length = GetProperty(KeysObject, "length")
ReDim KeysArray(Length - 1)
Index = 0
For Each Key In KeysObject
KeysArray(Index) = Key
Index = Index + 1
Next
GetKeys = KeysArray
End Function
Public Sub TestJsonAccess()
Dim JsonString As String
Dim JsonObject As Object
Dim Keys() As String
Dim Value As Variant
Dim j As Variant
InitScriptEngine
JsonString = "{""key1"": ""val1"", ""key2"": { ""key3"": ""val3"" } }"
Set JsonObject = DecodeJsonString(CStr(JsonString))
Keys = GetKeys(JsonObject)
Value = GetProperty(JsonObject, "key1")
Set Value = GetObjectProperty(JsonObject, "key2")
End Sub
一些注意事项:
- If the
JScriptTypeInfo
实例指的是 Javascript 对象,For Each ... Next
行不通的。但是,如果它引用 Javascript 数组,它确实可以工作(请参阅GetKeys
功能)。
- 名称仅在运行时才知道的访问属性,请使用以下函数
GetProperty
and GetObjectProperty
.
- Javascript 数组提供属性
length
, 0
, Item 0
, 1
, Item 1
等等。使用 VBA 点符号 (jsonObject.property
),只有 length 属性是可访问的,并且只有当你声明一个名为length
全部为小写字母。否则大小写不匹配,就找不到它。其他属性在 VBA 中无效。所以最好使用GetProperty
功能。
- 该代码使用早期绑定。所以你必须添加对“Microsoft Script Control 1.0”的引用。
- 你必须打电话
InitScriptEngine
在使用其他函数之前进行一次基本的初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)