En Excel VBA en Windows, para las variables JSON analizadas, ¿qué es este JScriptTypeInfo de todos modos?
(1)
Un posible lugar para buscar es en la biblioteca de tipos para ScriptControl, ya que esta es la biblioteca que emana este tipo.
Los detalles completos de este tipo en mi máquina son
Libary Name: Microsoft Script Control 1.0 (Ver 1.0)
LIBID: {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}
Location: C:/wINDOWS/SysWOW64/msscript.ocx
Utilizando tanto el Object Browser de VBA IDE como OLEVIEW.exe que desmonta la biblioteca de tipos, no puedo rastrear la interfaz JScriptTypeInfo o el método hasOwnProperty.
Pero no es el caso de que el motor de script aloje implementaciones de lenguaje, como VBScript y JScript (nombre de Microsoft para Javascript).
Entonces, tal vez deberíamos buscar una DLL de implementación JScript y, de hecho, hay una aquí que son detalles
Libary Name: Microsoft JScript Globals
LIBID: {3EEF9759-35FC-11D1-8CE4-00C04FC2B085}
Location: C:/wINDOWS/SysWOW64/jscript.dll
que en mi máquina no está registrada, por lo que no está en mi lista de Herramientas-> Bibliotecas de referencias o en OLEVIEW.exe.
Tuve la suerte de encontrar mientras hurgaba.
Aquí hay algunos resultados de OLEVIEW que ofrecen una excepción de la biblioteca de tipos
[
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();
};
Esto muestra que hasOwnProperty es un método de una interfaz IDispatch (o dispinterface) necesaria para trabajar con objetos declarados de tipo VBA Object (por ejemplo,
Dim foo as Object
). El registro de la biblioteca de tipos con regsvr32 parece no hacer nada.
Uno debe buscar el archivo en Herramientas Referencias para verlo en el navegador de objetos de VBA.
Podemos estar bastante seguros acerca de este archivo JScript.dll porque al usar el Explorador de procesos podemos ver que se carga el archivo dll al ejecutar la línea
oScriptEngine.Language = "JScript"
A falta de una biblioteca de tipos registrada,
oScriptEngine.Language = "JScript"
el archivo JScript.dll en Notepad ++ y busqué .JScriptTypeInfo como una expresión regular y encontré un hit.
¡Bingo!
No solo hay una ObjectInstance que describiría la mayoría de las variables que encuentra un programa VBA, sino que también hay una ArrayInstance que es intrigante, tal vez podamos usar las propias funciones de matriz de Javascript o al menos un subconjunto como se documenta en la biblioteca de tipos de JScript.dll. Aquí hay un código de muestra
''Tools->References->
''Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:/Windows/SysWOW64/msscript.ocx
''and FYI/browsing capabilities Microsoft JScript Globals; C:/wINDOWS/SysWOW64/jscript.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), "length", VbGet) = 6
Debug.Assert CallByName(objJSON(1), "0", 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), "length", VbGet) = 5
Debug.Assert CallByName(objSplice, "length", VbGet) = 1
Dim objSlice As Object
Set objSlice = CallByName(objJSON(1), "slice", VbMethod, 2)
Debug.Assert CallByName(objJSON(1), "length", VbGet) = 5
Debug.Assert CallByName(objSlice, "length", VbGet) = 3
Stop
Call CallByName(objJSON(1), "sort", VbMethod)
Debug.Assert CallByName(objJSON(1), "join", VbMethod) = "1234,2345,3456,5678,6789"
Debug.Assert CallByName(objJSON(1), "join", VbMethod, " ") = "1234 2345 3456 5678 6789"
Stop
Debug.Assert CallByName(objJSON(1), "pop", VbMethod) = "6789"
Debug.Assert CallByName(objJSON(1), "length", VbGet) = 4
Stop
End Sub
RESUMEN: JScriptTypeInfo es algo para mostrar en la ventana de observación IDE de VBA y el retorno de la función VBA TypeName () pero que realmente oculta una cantidad de objetos que se pueden encontrar en JScript.dll.
Supongo que puede describirse como polimórfico, tal vez mejor describirlo como unión tardía.
Para ver las capacidades, use Tools-References y busque JScript.dll.
respondiendo mi propia pregunta aquí.
He realizado algunos trabajos con JSON en Excel VBA y muchos resultados para publicar, lo que haré en formato de preguntas y respuestas
https://stackoverflow.com/help/self-answer
http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/
Entonces, en otra parte de stackoverflow, uno puede ver preguntas sobre el análisis de JSON en VBA, pero parece que pierden uno o dos trucos.
Para empezar, evito usar bibliotecas de análisis JSON personalizadas y en su lugar uso el método Eval de ScriptControl como base de todo mi código JSON. Y también expresamos una preferencia de las soluciones nativas de Microsoft.
Aquí hay una pregunta previa En Excel VBA en Windows, ¿cómo mitigar el problema del cruce de sintaxis de puntos de JSON analizado roto por el comportamiento de capitalización de IDE? sobre el cual se construye esta pregunta. Muestra cómo usar VBA.CallByName es más robusto que usar la sintaxis de puntos para atravesar un objeto JSON analizado. También otra pregunta anterior En Excel VBA en Windows, ¿cómo recorrer un conjunto JSON analizado? muestra cómo también se puede usar para acceder a los elementos de la matriz. Pero CallByName devuelve un tipo de variable curioso que aparece en la ventana Watch como Object / JScriptTypeInfo y si uno escribe Debug.Print en la ventana inmediata (o se desplaza sobre la variable) se obtiene el "[objeto Object]" no informativo. En otra pregunta de la serie In Excel VBA en Windows, ¿cómo obtener una representación JSON en cadena en lugar de “[objeto Object]” para las variables JSON analizadas? Les presento un "azúcar" de depuración que permite una buena inspección de las variables. En una cuarta pregunta En Windows Excel VBA, ¿cómo obtener claves JSON para evitar el "error de tiempo de ejecución ''438'': el objeto no admite esta propiedad o método"? , mientras investigo cómo consultar un objeto JSON para un miembro, descubro un método hasOwnProperty () que parece adjunto a un objeto JScriptTypeInfo.
Entonces, en esta pregunta, ¿qué es exactamente este JScriptTypeInfo de todos modos?
Esta es la pregunta 5 de la serie de 5. Aquí está la serie completa
Q2 En Excel VBA en Windows, ¿cómo recorrer un conjunto JSON analizado?