В Excel VBA для Windows, для разобранных JSON-переменных, что это такое JScriptTypeInfo?

отвечая на мой собственный вопрос.
Я проделал некоторую работу с JSON в Excel VBA и много результатов для публикации, которые я сделаю в формате Q & A. Https://stackoverflow.com/help/self-answer http://blog.stackoverflow.com/2011 / 07 / его нормально-к-аск-ответ-своего собственного вопросы /

Поэтому в другом месте в stackoverflow можно увидеть вопросы о parsingе JSON в VBA, но они, похоже, пропустили трюк или два.

Во-первых, я отказываюсь от использования пользовательских JSON-анализирующих библиотек и вместо этого использую метод Eval ScriptControl как основу всего кода JSON. А также мы выражаем предпочтение от родных решений Microsoft.

Вот предварительный вопрос. В Excel VBA на Windows, как смягчить проблему синтаксического обхода синтаксического анализа JSON, нарушенного поведением капитализации IDE? на котором строится этот вопрос. Он показывает, как использование VBA.CallByName является более надежным, чем использование точечного синтаксиса для прохождения анализируемого объекта JSON. Также еще один предыдущий вопрос В Excel VBA на Windows, как циклически обрабатывать массив JSON? показывает, как его также можно использовать для доступа к элементам массива. Но CallByName возвращает любопытный тип переменной, который появляется в окне Watch как Object / JScriptTypeInfo, и если один тип Debug.Print в непосредственном окне (или зависает над переменной) получает неинформативный «объект объекта». В другом вопросе в серии В Excel VBA на Windows, как получить сжатое JSON respresentation вместо «[object Object]» для проанализированных переменных JSON? Я представляю некоторый отладочный «сахар», который позволяет хорошо проверять переменные. В четвертом вопросе В Windows Excel VBA, как получить ключи JSON, чтобы упредить «Ошибка времени выполнения» 438: Объект не поддерживает это свойство или метод »? , в то время как исследование того, как запрашивать объект JSON для члена, я обнаруживаю метод hasOwnProperty (), который кажется прикрепленным к объекту JScriptTypeInfo.

Поэтому в этом вопросе я спрашиваю, что же это за JScriptTypeInfo?

Это вопрос 5 из серии 5. Вот полная серия

Q1 В Excel VBA на Windows, как смягчить проблему синтаксического обхода синтаксического анализа JSON, нарушенного поведением капитализации IDE?

Q2. В Excel VBA на Windows, как циклически обрабатывать массив JSON?

Q3 В Excel VBA на Windows, как получить сжатое JSON-репрезентацию вместо «[object Object]» для проанализированных переменных JSON?

Q4. В Windows Excel VBA, как получить ключи JSON для предварительной «ошибки времени выполнения» 438: Объект не поддерживает это свойство или метод »?

Q5 В Excel VBA для Windows, для разобранных переменных JSON, что это такое JScriptTypeInfo?

Одно возможное место для поиска – это библиотека типов для ScriptControl, так как это библиотека, которая испускает этот тип.

Полные данные этого типа на моей машине

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

Используя обозреватель объектов VBA IDE и OLEVIEW.exe, который разбирает библиотеку типов, я не могу отслеживать интерфейс JScriptTypeInfo или метод hasOwnProperty.

Но не так ли, что движок сценария поддерживает языковые реализации, такие как VBScript и JScript (имя Microsoft для Javascript).
Так что, возможно, нам следует искать DLL-реализацию JScript и, действительно, здесь есть подробности

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

который на моей машине не зарегистрирован и поэтому не включен в список «Инструменты»> «Библиотеки библиотек» или в OLEVIEW.exe. Мне посчастливилось найти, пока тыкаешься.
Вот некоторые результаты из OLEVIEW, дающие эксцесс библиотеки типов

 [ 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), необходимым для работы с объявленным объектом типа VBA типа Object (например, Dim foo as Object ). Регистрация библиотеки типов с помощью regsvr32, похоже, ничего не делает. Для просмотра в обозревателе объектов VBA необходимо перейти к файлу в списке инструментов.

Мы можем быть уверены в этом файле JScript.dll, потому что, используя Process Explorer, мы можем видеть, как DLL загружается при выполнении строки oScriptEngine.Language = "JScript" При отсутствии зарегистрированной библиотеки типов я загрузил файл JScript.dll в Notepad ++ и искал .JScriptTypeInfo как регулярное выражение и нашел хит. Бинго!

Мало того, что существует ObjectInstance, который описывает большинство переменных, с которыми сталкивается программа VBA, но также есть ArrayInstance, который интригует, возможно, мы можем использовать собственные функции массива Javascript или, по крайней мере, подмножество, как описано в библиотеке типов JScript.dll. Вот пример кода

 '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 

РЕЗЮМЕ: JScriptTypeInfo – это что-то, что можно показать в окне просмотра VBA IDE и возврате функции VBA TypeName (), но которая действительно скрывает несколько объектов, которые можно найти в JScript.dll.
Полагаю, это можно описать как полиморфное, возможно, лучше описать его как позднее связывание. Чтобы просмотреть возможности, используйте Tools-References и перейдите к JScript.dll.

  • Полностью указать рабочий лист по кодовому имени
  • Как использовать регулярные выражения (регулярное выражение) в Microsoft Excel как внутри ячейки, так и в цикле
  • Как вводить только уникальные значения в столбце Excel 2007
  • Параметры VBA, ADO.Connection и query
  • 2 Размерный массив из диапазона
  • Excel: двухцветные цветовые шкалы
  • Не удалось выполнить метод ShowAllData classа Worksheet
  • Как безопасно хранить информацию о строках соединения в VBA
  • Лучше ли использовать ADO или DAO в Access 2007?
  • Поиск excel с двумя поисковыми словами (множественный поиск) с использованием макроса vba
  • Могу ли я запустить этот макрос быстрее?
  • Давайте будем гением компьютера.