No Excel VBA no Windows, para variáveis JSON analisadas, o que é esse JScriptTypeInfo mesmo assim?



(1)

Um possível lugar para procurar está na biblioteca de tipos para o ScriptControl como esta é a biblioteca que emana esse tipo.

Os detalhes completos deste tipo na minha máquina são

Libary Name:    Microsoft Script Control 1.0 (Ver 1.0)       
LIBID:          {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}
Location:       C:\wINDOWS\SysWOW64\msscript.ocx 

Usando o Object Browser do VBA IDE e o OLEVIEW.exe que desmonta a biblioteca de tipos, não consigo rastrear a interface JScriptTypeInfo ou o método hasOwnProperty.

Mas não é o caso de o mecanismo de script hospedar implementações de linguagem, como VBScript e JScript (nome da Microsoft para Javascript).
Então, talvez devêssemos procurar por uma DLL de implementação do JScript e, de fato, há um aqui são detalhes

Libary Name:    Microsoft JScript Globals
LIBID:          {3EEF9759-35FC-11D1-8CE4-00C04FC2B085}
Location:       C:\wINDOWS\SysWOW64\jscript.dll 

que na minha máquina não está registrado e, portanto, não na minha lista de bibliotecas de ferramentas-> referências ou em OLEVIEW.exe. Tive a sorte de encontrar enquanto procurava.
Aqui está alguma saída de OLEVIEW dando um exceprt da 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();
};

Isso mostra o hasOwnProperty como um método de uma interface IDispatch (ou dispinterface) necessária para trabalhar com o objeto declarado do objeto VBA (por exemplo, Dim foo as Object ). Registrar a biblioteca de tipos com regsvr32 parece não fazer nada. É preciso procurar o arquivo em Referências de Ferramentas para visualizar no navegador de objetos do VBA.

Podemos ter certeza sobre esse arquivo JScript.dll porque, usando o Process Explorer, podemos ver a dll sendo carregada ao executar a linha oScriptEngine.Language = "JScript" Na falta de uma biblioteca de tipos registrada, carreguei o arquivo JScript.dll no Notepad ++ e procurou por .JScriptTypeInfo como uma expressão regular e encontrou um hit. Bingo!

Não só existe uma ObjectInstance que descreveria a maioria das variáveis ​​que um programa VBA encontra, mas também existe uma ArrayInstance que é intrigante, talvez possamos usar funções de matriz do Javascript ou pelo menos um subconjunto conforme documentado na biblioteca de tipos do JScript.dll. Aqui está um código de amostra

'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

RESUMO: JScriptTypeInfo é algo para mostrar na janela de inspeção do VBA IDE e o retorno da função VBA TypeName (), mas que realmente oculta vários objetos que podem ser encontrados no JScript.dll.
Suponho que possa ser descrito como polimórfico, talvez melhor descrevê-lo como ligação tardia. Para exibir recursos, use Ferramentas-Referências e navegue até JScript.dll.

respondendo minha própria pergunta aqui.
Eu tenho feito algum trabalho com JSON no Excel VBA e muitas descobertas para postar, o que eu farei em formato Q & A https://stackoverflow.com/help/self-answer http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/

Então, em outros lugares no stackoverflow, pode-se ver questões sobre a análise do JSON no VBA, mas eles parecem perder um truque ou dois.

Para começar, eu refiz o uso de bibliotecas de análise JSON personalizadas e, em vez disso, uso o método Eval do ScriptControl como a base de todo o código JSON. E também expressamos uma preferência das soluções nativas da Microsoft.

Aqui está uma pergunta anterior No Excel VBA no Windows, como atenuar o problema da passagem de sintaxe de pontos do JSON analisado interrompido pelo comportamento de capitalização do IDE? sobre o qual esta questão é construída. Ele mostra como usar o VBA.CallByName é mais robusto do que usar a sintaxe de ponto para atravessar um objeto JSON analisado. Também outra pergunta anterior No Excel VBA no Windows, como percorrer um array JSON analisado? mostra como também pode ser usado para acessar elementos de matriz. Mas CallByName retorna um curioso tipo de variável que aparece na janela Watch como objeto / JScriptTypeInfo e se um tipo Debug.Print na janela imediata (ou focaliza a variável) obtém-se o uninformative "[object Object]". Em outra pergunta da série No Excel VBA no Windows, como obter a representação em JSON com stringed em vez de “[object Object]” para variáveis ​​JSON analisadas? Eu apresento alguns "sugar" de depuração que permitem uma boa inspeção das variáveis. Em uma quarta questão No Windows Excel VBA, como obter chaves JSON para antecipar-se "Erro em tempo de execução '438': objeto não oferece suporte a essa propriedade ou método"? Enquanto investiga como consultar um objeto JSON para um membro, descubro um método hasOwnProperty () que parece anexado a um objeto JScriptTypeInfo.

Então, nessa pergunta, pergunto: o que exatamente é esse JScriptTypeInfo?

Esta é a pergunta 5 da série de 5. Aqui está a série completa

P1 No Excel VBA no Windows, como atenuar o problema da passagem da sintaxe de pontos do JSON analisado interrompido pelo comportamento de capitalização do IDE?

Q2 No Excel VBA no Windows, como percorrer um array JSON analisado?

Q3 No Excel VBA no Windows, como obter uma representação em JSON com string em vez de “[object Object]” para variáveis ​​JSON analisadas?

Q4 No Windows Excel VBA, como obter chaves JSON para preempção "Erro em tempo de execução '438': objeto não oferece suporte a essa propriedade ou método"?

Q5 No Excel VBA no Windows, para variáveis ​​JSON analisadas, o que é esse JScriptTypeInfo mesmo assim?





vba