Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Listing 1: Beispiel für eine JSON-Datei
JSON heißt JavaScript Object Notation und ist wie XML ein Format, mit dem Daten strukturiert gespeichert werden können. Als Visual Basic-Entwickler hat man üblicherweise nicht viele Berührungspunkte mit dieser Notation. Wenn man jedoch gelegentlich mit Webservices beziehungsweise Rest APIs arbeitet, findest der Datenaustausch entweder mit XML oder JSON statt. Während es für den Zugriff auf den Inhalt von XML-Dokumenten die “Microsoft XML, vX.0”-Bibliothek gibt, ist man bei JSON auf Lösungen von Drittherstellern angewiesen. In diesem Fall nutzen wir eine Bibliothek von Tim Hall und eine Erweiterung im Eigenbau, mit der wir relativ einfach auf die Daten in JSON-Dokumenten zugreifen können.
Wer mit Rest APIs wie mit dem aktuell gefragten Webservice von OpenAI arbeitet, bekommt von diesen Antworten entweder im XML- oder im JSON-Format. Wie Du die Rest API von OpenAI ansprichst, um die dahinter stehende, sogenannte “künstliche Intelligenz” zu nutzen, erklären wir im Artikel OpenAI mit VBA (www.vbentwickler.de/355). Das Ergebnis eines solchen Aufrufs sieht wie in Listing 1 aus.
{ "id":"cmpl-6kCY6I3xWbEUljecYvr9nKV5GsY3s", "object":"text_completion", "created":1676469346, "model":"text-davinci-003", "choices":[ { "text":"\n\nLeider gibt es keine native OpenAI-Integration in Microsoft Office. Wenn Sie OpenAI jedoch in Microsoft Office verwenden möchten, können Sie versuchen, eine Lösung zu implementieren, die OpenAI- APIs verwendet, um die Anwendungen in Ihrer Office-Suite zu erweitern. Solche Lösungen beinhalten normalerweise die Entwicklung eigener Apps und Add-Ins, die OpenAI-APIs verwenden, um bestimmte Funktionen in Microsoft Office bereitzustellen.", "index":0, "logprobs":null, "finish_reason":"stop" } ], "usage":{ "prompt_tokens":14, "completion_tokens":146, "total_tokens":160 } }
Listing 1: Beispiel für eine JSON-Datei
Ein solches Ergebnis können wir in eine String-Variable einfügen und dann mithilfe von Zeichenketten-Funktionen die gewünschten Informationen herausfiltern. Wenn wir für das JSON-Dokument aus dem Beispiel etwa den Inhalt des Elements text erhalten wollen, könnten wir wie folgt vorgehen – und hier gehen wir davon aus, dass das JSON-Dokument nicht so schön formatiert daherkommt wie im abgebildeten Listing, sondern ohne Zeilenumbrüche und ohne Einrückungen. Genau genommen wären die formatierenden Elemente beim Auslesen von Daten per VBA auch eher hinderlich (siehe Listing 2). Hier haben wir das zu untersuchende JSON-Dokument in die Variable strJSON geschrieben. Dann suchen wir mit der InStr-Funktion nach dem ersten Auftreten des Elements text mit den umschließenden Anführungszeichen und dem folgenden Doppelpunkt – gefolgt sicherheitshalber noch vom Anführungszeichen des gesuchten Wertes: “”text””:””
Public Sub JSONPerZeichenkette() Dim strJSON As String Dim strText As String Dim lngStart As Long Dim lngEnde As Long strJSON = strJSON & "{""id"":""cmpl-6kCY6I3xWbEUljecYvr9nKV5GsY3s"",""object"":""text_completion""," _ & """created"":1676469346,""model"":""text-davinci-003"",""choices"":[{""text"":""\n\nLeider gibt es " _ & "keine native OpenAI-Integration in Microsoft Office. ..."",""index"":0,""logprobs"":null," _ & """finish_reason"":""stop""}],""usage"":{""prompt_tokens"":14,""completion_tokens"":146," _ & """total_tokens"":160}}" & vbCrLf lngStart = InStr(1, strJSON, """text"":""") If Not lngStart = 0 Then lngStart = lngStart + Len("""text"":""") lngEnde = InStr(lngStart, strJSON, """,") If Not lngEnde = 0 Then strText = Mid(strJSON, lngStart, lngEnde - lngStart) Debug.Print strText End If End If End Sub
Listing 2: Parsen auf herkömmliche Art mit Zeichenkettenfunktionen
Diese Position merken wir uns mit der Variablen lngStart. Ist diese gleich 0, wurde der Text nicht gefunden – an dieser Stelle geschieht nichts weiter und die Prozedur wird beendet. Wurde allerdings eine Position gefunden, in diesem Beispiel 131, ist die Bedingung der If…Then-Bedingung erfüllt. Da wir aber eigentlich die Startposition des Inhalts von text haben wollen, zählen wir noch die Länge der Zeichenkette, die dem gesuchten Text vorausgeht, hinzu. Nun benötigen wir noch die Endposition des einzulesenden Textes. Dazu gehen wir davon aus, dass dieser durch ein Anführungszeichen mit einem folgenden Komma abgeschlossen wird. Die Position dieser Fundstelle ermitteln wir wieder mit InStr, diesmal allerdings mit der Position aus lngStart als Startposition. Finden wir auch hier einen Wert, können wir anschließend mit der Mid-Funktion den gesuchten Text extrahieren und beispielsweise im Direktbereich ausgeben.