在Windows的Excel VBA中,如何缓解由IDE的大小写行为破坏的parsingJSON的点语法遍历问题?

在Windows上的Excel VBA中,如何缓解由IDE的大小写行为破坏的parsingJSON的点语法遍历问题?

嗨,在这里回答我自己的问题。 我已经在Excel VBA中使用JSON做了一些工作,并且发布了大量的调查结果,我将以问答格式进行发布。https: //stackoverflow.com/help/self-answer http://blog.stackoverflow.com/2011 / 07 / ITS-OK-到问一答,你自己的问题/

所以在stackoverflow的其他地方,你可以看到关于在VBA中parsingJSON的问题,但他们似乎错过了一两招。

首先,我使用自定义的JSONparsing库进行了重新设置,而改用ScriptControl的Eval方法作为我所有JSON代码的基础。 而且我们也expression了本地微软解决scheme的偏好。

在第一个问题中,我将展示在Excel VBA中实际上可以使用点语法来遍历JSON结构,但不幸的是,这被VBA IDE的大写“帮助”打破了。

下面是一些示例代码,标记为1的行:我们可以看到文本“objJSON.key1”,这个代码一直工作,直到一个取消注释

'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 

这是之前的截图 BeforeUncommentedAnnotated 在取消第二行的注释之后,Line1被现在赋予大写字母“K”的符号“key1”重写。

AfterCommentedAnnoted

现在经过一番试验,重写效果似乎只限于项目范围,所以其他项目不受影响。 这意味着可以通过总是使用一个单独的项目来隔离这个问题,但是如何将这个对象集中到消费项目中,然后再访问它,肯定会再次遇到同样的问题。 所以,项目隔离并不是真正的解决scheme。

一种方法是确保符号不冲突,并给JSON键某种types的前缀,所以这里是一个例子

 '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,这是我的答案中显示的技术。

我没有select自己的答案作为权威,因为我认为(1)似乎社区可以继续提高我们对Excel VBA中JSONparsing的知识,以及(2)如果有人发现如何停止大写,那么这显然是赢家。

这是系列5的问题1.这里是全系列

Q1 在Windows上的Excel VBA中,如何缓解IDE大小写行为破坏的parsingJSON的点语法遍历问题?

Q2 在Windows上的Excel VBA中,如何通过parsing的JSON数组循环?

Q3 在Windows的Excel VBA中,如何获得string化的JSON表示而不是“[object object]”来parsingJSONvariables?

Q4 在Windows Excel VBA中,如何获取JSON密钥以预先取得“运行时错误438”:对象不支持此属性或方法“?

Q5 在Windows的Excel VBA中,对于parsing的JSONvariables,这个JScriptTypeInfo是什么?

最后,我用下面这个使用本地VBA.CallByName的进展

 'Tools->References-> 'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx Private Sub TestJSONParsingWithCallByName() 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 + ")") Debug.Assert VBA.CallByName(objJSON, "key1", VbGet) = "value1" Debug.Assert VBA.CallByName(VBA.CallByName(objJSON, "key2", VbGet), "key3", VbGet) = "value3" End Sub