Mit JSON arbeiten

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar