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

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

Привет, отвечая на мой собственный вопрос здесь. Я проделал некоторую работу с JSON в Excel VBA и опубликовал множество выводов, которые я сделаю в формате вопросов и ответов.https://stackoverflow.com/help/self-answer http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/

Так что в другом месте на stackoverflow можно увидеть вопросы о синтаксическом анализе JSON в VBA, но они, кажется, пропускают хитрость или два.

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

В этом первом вопросе я покажу, что в Excel VBA фактически можно использовать точечный синтаксис для обхода структуры JSON, но, к сожалению, это нарушается «полезностью» среды IDE VBA в отношении капитализации.

Ниже приведен пример кода, где в строке обозначено 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

Вот скриншот передИ после раскомментирования строки 2 строка 1 перезаписывается символом «key1», теперь с большой буквы «K».

Теперь после некоторых экспериментов кажется, что эффект перезаписи ограничен рамками проекта, поэтому другие проекты не затрагиваются. Это означает, что можно изолировать проблему, всегда используя отдельный проект, но затем, как можно было бы упорядочить объект в проекте-потребителе и, следовательно, получить к нему доступ, несомненно, снова возникнет та же проблема. Таким образом, изоляция проекта на самом деле не является решением.

Один из способов - убедиться, что символы не конфликтуют, и дать ключам JSON некоторый префикс, так что вот пример

'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 мог осуществлять доступ. С шапкой для пользователя Codohttps://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, и эта техника показана в моем ответе.

Я не выбрал свой собственный ответ как окончательный, потому что я думаю, что (1) кажется, что сообщество может продолжать улучшать наши знания по синтаксическому анализу JSON в Excel VBA и (2), если кто-то узнает, как остановить использование заглавных букв, тогда это очевидный победитель.

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

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

Q2В Excel VBA на Windows, как пройти через анализируемый массив JSON?

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

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос