在Windows上的Excel VBA中,对于已解析的JSON变量,这个JScriptTyp
在这里回答我自己的问题.
我已经在Excel VBA中使用 JSON做了一些工作,并发布了大量的发现,我将在Q&格式 https://stackoverflow.com/help/self-answer http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ 所以在stackoverflow的其他地方,人们可以看到有关在VBA中解析JSON的问题,但他们似乎错过了一两个技巧. 首先,我重新使用自定义JSON解析库,而是使用ScriptControl的Eval方法作为我所有JSON代码的基础. 这是问题In Excel VBA on Windows,how to mitigate issue of dot syntax traversal of parsed JSON broken by IDE’s capitalisation behaviour?的先验问题.它显示了如何使用VBA.CallByName更健壮 所以在这个问题中我问,究竟这个JScriptTypeInfo究竟是什么? 这是5系列的问题5.这是完整系列 Q1 In Excel VBA on Windows,how to mitigate issue of dot syntax traversal of parsed JSON broken by IDE’s capitalisation behaviour? Q2 In Excel VBA on Windows,how to loop through a JSON array parsed? Q3 In Excel VBA on Windows,how to get stringified JSON respresentation instead of “[object Object]” for parsed JSON variables? Q4 In Windows Excel VBA,how to get JSON keys to pre-empt “Run-time error ‘438’: Object doesn’t support this property or method”? Q5 In Excel VBA on Windows,for parsed JSON variables what is this JScriptTypeInfo anyway? 解决方法
一个可能的地方是ScriptControl的类型库,因为这是发出此类型的库.
我机器上这种类型的完整细节是 Libary Name: Microsoft Script Control 1.0 (Ver 1.0) LIBID: {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC} Location: C:wINDOWSSysWOW64msscript.ocx 使用VBA IDE的对象浏览器和反汇编类型库的OLEVIEW.exe,我无法跟踪接口JScriptTypeInfo或方法hasOwnProperty. 但是脚本引擎不是主持语言实现的情况,例如VBScript和JScript(Javascript的Microsoft名称). Libary Name: Microsoft JScript Globals LIBID: {3EEF9759-35FC-11D1-8CE4-00C04FC2B085} Location: C:wINDOWSSysWOW64jscript.dll 我的机器上没有注册,因此不在我的工具 – >参考库列表或OLEVIEW.exe中.我很幸运,一边寻找一边. [ uuid(3EEF9758-35FC-11D1-8CE4-00C04FC2B097) ] dispinterface ObjectInstance { properties: methods: [id(0x0000044c)] StringInstance* toString(); [id(0x0000044d)] StringInstance* toLocaleString(); [id(0x0000044e)] VARIANT hasOwnProperty(VARIANT propertyName); [id(0x0000044f)] VARIANT propertyIsEnumerable(VARIANT propertyName); [id(0x00000450)] VARIANT isPrototypeOf(VARIANT obj); [id(0x00000451)] ObjectInstance* valueOf(); }; 上面显示hasOwnProperty是一个IDispatch接口(或dispinterface)的方法,用于处理声明为Object类型的VBA对象(例如Dim foo as Object) 我们可以非常确定这个JScript.dll文件,因为使用Process Explorer我们可以看到在执行行时加载的dllEngine.Language =“JScript” 不仅有一个ObjectInstance可以描述VBA程序遇到的大多数变量,而且还有一个有趣的ArrayInstance,也许我们可以使用Javascript自己的数组函数 'Tools->References-> 'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:WindowsSysWOW64msscript.ocx 'and FYI/browsing capabilities Microsoft JScript Globals; C:wINDOWSSysWOW64jscript.dll Option Explicit Private Sub TestJSONParsingWithCallByName5() Dim oScriptEngine As ScriptControl Set oScriptEngine = New ScriptControl oScriptEngine.Language = "JScript" Dim sJsonString(0 To 1) As String sJsonString(0) = "{'key1': 'value1','key2': { 'key3': 'value3' } }" sJsonString(1) = "[ 1234,2345,3456,4567,5678,6789 ]" Dim objJSON(0 To 1) As Object Set objJSON(0) = oScriptEngine.Eval("(" + sJsonString(0) + ")") Set objJSON(1) = oScriptEngine.Eval("(" + sJsonString(1) + ")") Debug.Assert objJSON(0).hasOwnProperty("key1") Debug.Assert objJSON(0).hasOwnProperty("key2") Debug.Assert CallByName(objJSON(1),"length",VbGet) = 6 Debug.Assert CallByName(objJSON(1),"0",VbGet) = "1234" '* Is objJSON(1) an ArrayInstance? '* does it support the reverse method of the ArrayInstance object? 'Call objJSON(1).Reverse '* reverse gets capitalised into Reverse ... grrrr Call CallByName(objJSON(1),"reverse",VbMethod) '* so use CallByName as solution to "helpful" capitalisation '* Yes,the elements are reversed! Debug.Assert CallByName(objJSON(1),VbGet) = "6789" Stop '** And now we know objJSON(1) is an ArrayInstance we can have some fun with array operations Dim objSplice As Object Set objSplice = CallByName(objJSON(1),"splice",VbMethod,2,1) Debug.Assert CallByName(objJSON(1),VbGet) = 5 Debug.Assert CallByName(objSplice,VbGet) = 1 Dim objSlice As Object Set objSlice = CallByName(objJSON(1),"slice",2) Debug.Assert CallByName(objJSON(1),VbGet) = 5 Debug.Assert CallByName(objSlice,VbGet) = 3 Stop Call CallByName(objJSON(1),"sort",VbMethod) Debug.Assert CallByName(objJSON(1),"join",VbMethod) = "1234,6789" Debug.Assert CallByName(objJSON(1)," ") = "1234 2345 3456 5678 6789" Stop Debug.Assert CallByName(objJSON(1),"pop",VbMethod) = "6789" Debug.Assert CallByName(objJSON(1),VbGet) = 4 Stop End Sub 概要:JScriptTypeInfo是在VBA IDE监视窗口中显示的东西,以及VBA函数TypeName()的返回,但它实际上隐藏了可以在JScript.dll中找到的许多对象.我认为它可以被描述为多态,也许更好地将其描述为后期绑定.要查看功能,请使用Tools-References并浏览到JScript.dll. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |