Wie kann in Excel VBA unter Windows das Problem der Punktsyntax-Überquerung von analysiertem JSON, das durch das Großschreibungsverhalten von IDE unterbrochen wurde, behoben werden?
Wie kann in Excel VBA unter Windows das Problem der Punktsyntaxüberquerung von analysiertem JSON, das durch das Großschreibungsverhalten von IDE unterbrochen wurde, gemindert werden?
Hi, hier beantworte ich meine eigene Frage. Ich habe einige Arbeiten mit JSON in Excel VBA durchgeführt und viele Ergebnisse veröffentlicht, die ich im Q & A-Format veröffentlichen werdhttps: //stackoverflow.com/help/self-answe http: //blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions
Also woanders auf stackoverflow kann man Fragen zum Parsen von JSON in VBA sehen, aber sie scheinen einen oder zwei Tricks zu verpassen.
Zu Beginn verzichte ich auf benutzerdefinierte JSON-Parsing-Bibliotheken und verwende stattdessen die Eval-Methode von ScriptControl als Grundlage für meinen gesamten JSON-Code. Außerdem geben wir eine Präferenz für native Microsoft-Lösungen an.
In dieser ersten Frage werde ich zeigen, dass man in Excel VBA zwar die Punktsyntax verwenden kann, um eine JSON-Struktur zu durchlaufen, dies jedoch leider durch die "Hilfsbereitschaft" der VBA-IDE in Bezug auf die Großschreibung beeinträchtigt wird.
Below ist ein Beispielcode, in dem in der mit 1 bezeichneten Zeile der Text "objJSON.key1" angezeigt wird und dieser Code funktioniert, bis ein Kommentar aufgehoben wird.
'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
Hier ist ein Screenshot vorUnd nach dem Auskommentieren von Zeile 2 wird Zeile 1 mit dem Symbol 'key1' neu geschrieben und erhält jetzt ein Großbuchstaben 'K'.
Nach einigem Experimentieren scheint es, dass der Umschreibungseffekt auf den Projektbereich beschränkt ist, sodass andere Projekte nicht betroffen sind. Dies bedeutet, dass man das Problem eingrenzen könnte, indem man immer ein separates Projekt verwendet. Wie würde man dann das Objekt zum konsumierenden Projekt verschieben und von dort aus darauf zugreifen, würde man mit Sicherheit dasselbe Problem erneut ansprechen. Projektisolation ist also keine wirkliche Lösung.
ine Möglichkeit besteht darin, sicherzustellen, dass die Symbole nicht zusammenstoßen, und den JSON-Schlüsseln eine Art Präfix zuzuweisen. Hier ist also ein Beispie
'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
Somehow gefällt mir das nicht, seltsamerweise muss man den JSON einfach so ändern, dass VBA darauf zugreifen kann. Außerdem hat man möglicherweise keine Kontrolle über den Quell-JSON.
Es gibt andere Methoden, z. B. das Hinzufügen von Javscript zur Skript-Engine, damit JavaScript darauf zugreifen kann. Mit einer Hutspitze an User Codohttps: //stackoverflow.com/users/413337/cod hier ist ein beispiel basierend auf diesem ansatz ...
'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
Ich mag die Technik, ein Skript zur Skript-Engine hinzuzufügen. Ich habe jedoch eine native Technik entdeckt, nämlich die Verwendung von VBA.CallByName. Diese Technik wird in meiner Antwort gezeigt.
Ich habe meine eigene Antwort nicht als endgültig ausgewählt, da ich denke, dass (1) die Community anscheinend unser Wissen über JSON-Parsing in Excel VBA weiter verbessern kann, und (2) wenn jemand herausfindet, wie die Großschreibung gestoppt werden kann, ist dies ein offensichtlicher Gewinner .
Dies ist Frage 1 der Serie von 5. Hier ist die vollständige Serie
Q5Was ist in Excel VBA unter Windows für analysierte JSON-Variablen überhaupt JScriptTypeInfo?