【发布时间】:2016-10-09 05:21:22
【问题描述】:
在 Windows 上的 Excel VBA 中,如何缓解 IDE 的大写行为破坏已解析 JSON 的点语法遍历问题?
嗨,在这里回答我自己的问题。我在 Excel VBA 中使用 JSON 完成了一些工作,并发布了许多发现,我将以问答格式进行发布 https://stackoverflow.com/help/self-answerhttps://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/
所以在 stackoverflow 的其他地方可以看到有关在 VBA 中解析 JSON 的问题,但他们似乎错过了一两个技巧。
首先,我放弃使用自定义 JSON 解析库,而是使用 ScriptControl 的 Eval 方法作为我所有 JSON 代码的基础。 我们还表达了对原生 Microsoft 解决方案的偏好。
在第一个问题中,我将展示在 Excel VBA 中,实际上可以使用点语法来遍历 JSON 结构,但不幸的是,这是 被 VBA IDE 在大写方面的“帮助”所打破。
下面是一些示例代码,在标记为 1 的行上:我们可以看到文本“objJSON.key1”,并且此代码一直有效,直到一个 uncmets
'Tools->References->
'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx
Option Explicit
Option Private Module
Private Sub TestJSONParsingWithVBACallByName()
Dim oScriptEngine As ScriptControl
Set oScriptEngine = New ScriptControl
oScriptEngine.Language = "JScript"
Dim sJsonString As String
sJsonString = "{'key1': 'value1' ,'key2': { 'key3': 'value3' } }"
Dim objJSON As Object
Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")")
1: Debug.Assert objJSON.key1 = "value1"
Debug.Assert objJSON.key2.key3 = "value3"
'**** BUT IF UNCOMMENT NEXT LINE THIS AFFECTS ALL CAPITALISATION INSTANCES OF KEY1 INCLUDING LINE 1 WHICH THENCE BREAKS
2: 'Dim Key1 as Long
End Sub
这是之前的截图 在取消注释第 2 行之后,第 1 行被重写为符号“key1”,现在给定一个大写字母“K”。
现在经过一些实验,似乎重写效果仅限于项目范围,因此其他项目不受影响。 这意味着人们可以通过始终使用单独的项目来隔离问题,但是如何将对象编组到使用项目和 从那里访问它,肯定会再次遇到同样的问题。因此,项目隔离并不是真正的解决方案。
一种方法是确保符号不冲突,并为 JSON 键提供某种前缀,因此这里是一个示例
'Tools->References->
'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx
Private Sub TestJSONParsingWithDotSyntaxAndKeyPrefixesToAvoidNameClash()
Dim oScriptEngine As ScriptControl
Set oScriptEngine = New ScriptControl
oScriptEngine.Language = "JScript"
Dim sJsonString As String
sJsonString = "{'kKey1': 'value1' ,'kKey2': { 'kKey3': 'value3' } }"
Dim objJSON As Object
Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")")
1: Debug.Assert objJSON.kKey1 = "value1"
Debug.Assert objJSON.kKey2.kKey3 = "value3"
'**** SAFE TO UNCOMMENT AS SYMBOLS DO NOT CLASH NOW
2: 'Dim Key1 As Long
End Sub
不知何故,我不喜欢这样,必须更改 JSON 以便 VBA 可以访问它似乎很奇怪。此外,可能无法控制源 JSON。
还有其他方法,例如在脚本引擎中添加一些 javscript 以允许 Javascript 进行访问。向用户 Codo https://stackoverflow.com/users/413337/codo 致敬,这里有一个基于这种方法的示例...
'Tools->References->
'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx
Private Sub TestJSONParsingWithMiniScript()
'hat tip to Codo https://stackoverflow.com/users/413337/codo
'Based on https://stackoverflow.com/questions/5773683/excel-vba-parsed-json-object-loop#7300963
Dim oScriptEngine As ScriptControl
Set oScriptEngine = New ScriptControl
oScriptEngine.Language = "JScript"
oScriptEngine.AddCode "function getProperty(jsonObj, propertyName) { return jsonObj[propertyName]; } "
Dim sJsonString As String
sJsonString = "{'key1': 'value1' ,'key2': { 'key3': 'value3' } }"
Dim objJSON As Object
Set objJSON = oScriptEngine.Eval("(" + sJsonString + ")")
Debug.Assert oScriptEngine.Run("getProperty", objJSON, "key1") = "value1"
Debug.Assert oScriptEngine.Run("getProperty", oScriptEngine.Run("getProperty", objJSON, "key2"), "key3") = "value3"
End Sub
我喜欢将脚本添加到脚本引擎的技术,但是我发现了一种更原生的技术,那就是使用 VBA.CallByName 这就是我的回答中显示的技术。
我没有选择我自己的答案作为确定的答案,因为我认为 (1) 社区似乎可以继续提高我们在 Excel VBA 中解析 JSON 的知识和 (2) 如果有人发现了如何阻止大写,那显然是赢家。
这是系列 5 的问题 1。这是完整系列
第二季度In Excel VBA on Windows, how to loop through a JSON array parsed?
Q5In Excel VBA on Windows, for parsed JSON variables what is this JScriptTypeInfo anyway?
【问题讨论】:
-
exceldevelopmentplatform.blogspot.com/2018/05/… 使用 bang 语法来解决这个问题。