{"id":55000893,"date":"2013-08-01T00:00:00","date_gmt":"2020-05-22T21:29:29","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=893"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"JSONDokumente_mit_VBA_parsen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/","title":{"rendered":"JSON-Dokumente mit VBA parsen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/b5978cb510734add810410cc52a31a2c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class=''introduction''>Webservices bedienen sich verschiedener Formate, um ihre Ergebnisse zu liefern. Meist wird zumindest XML angeboten, manchmal gibt es die Daten zus&auml;tzlich im JSON-Format. Beides kein Problem, da wir den Umgang mit XML-Dokumenten schon in verschiedenen Beitr&auml;gen beschrieben haben. Wenn allerdings nur JSON zur&uuml;ckgeliefert wird, m&uuml;ssen wir uns etwas einfallen lassen &#8211; es gibt n&auml;mlich kein Pendant zur MSXML-Bibliothek, mit der sich die Inhalte leicht auslesen lassen. Aber es gibt ja VBA &#8211; und damit bauen wir uns unseren eigenen Parser.<\/p>\n<p>Bei <b>JSON <\/b>handelt es sich um die <b>JavaScript Object Notation<\/b>. Der Aufbau &auml;hnelt ein wenig dem Aufbau von XML-Dateien, unterscheidet sich aber in manchen Punkten. Schauen wir uns zun&auml;chst an, wie solch ein Dokument aufgebaut ist und welche Elemente es enthalten kann.<\/p>\n<p>Ein einfaches <b>JSON<\/b>-Dokument sieht so aus:<\/p>\n<pre>{\r\n     \"Vorname\":\"Andr&eacute;\",\r\n     \"Nachname\":\"Minhorst\"\r\n}<\/pre>\n<p>Es besteht in diesem Fall aus zwei Objekten, wobei der Ausdruck vor dem Doppelpunkt dem Objektnamen entspricht und der hinter dem Doppelpunkt dem Wert.<\/p>\n<p>Etwas komplexer wird es, wenn ein Element ein Unterelement besitzt. In diesem Fall werden die Informationen zum Autor eines Artikels in einem Unterelement gespeichert. <\/p>\n<p>Das Unterelement ist wie das Hauptelement aufgebaut und dementsprechend in geschweifte Klammern eingefasst:<\/p>\n<pre>{\r\n     \"Titel\":\"JSON parsen mit VBA\",\r\n     \"Ausgabe\":\"4\/2013\",\r\n     \"Autor\":{\r\n         \"Vorname\":\"Andr&eacute;\",\r\n         \"Nachname\":\"Minhorst\"\r\n     }\r\n}<\/pre>\n<p>Schlie&szlig;lich gibt es noch Aufz&auml;hlungen, also Elemente, die einen Objektnamen und mehrere Elemente besitzen. Das folgende Beispiel listet die Hobbys einer Person auf, wobei diese in eckige Klammern eingefasst werden:<\/p>\n<pre>{\r\n     \"Vorname\":\"Andr&eacute;\",\r\n     \"Nachname\":\"Minhorst\",\r\n     \"Hobbys\":[\r\n         \"Lesen\",\"Reiten\",\"Programmieren\"\r\n     ]\r\n}<\/pre>\n<p>Nun sind leider nicht alle Elemente in Anf&uuml;hrungszeichen eingefasst, sondern nur Zeichenketten.<\/p>\n<p>Es gibt jedoch noch weitere Datentypen, die wie folgt formatiert werden &#8211; hier eine &uuml;bersicht &uuml;ber alle Varianten:<\/p>\n<ul>\n<li>Zeichenkette: wie oben dargestellt in Anf&uuml;hrungszeichen eingefasst. Zeichenketten k&ouml;nnen Escape- und Unicode-Zeichen enthalten, also beispielsweise <b>\\n <\/b>f&uuml;r einen Zeilenumbruch.<\/li>\n<li>Nullwerte: werden als <b>null <\/b>angegeben.<\/li>\n<li>Boolean: <b>true <\/b>oder <b>false<\/b>, allerdings ohne Anf&uuml;hrungszeichen<\/li>\n<li>Zahlen: ebenfalls ohne Anf&uuml;hrungszeichen, dargestellt mit Vorzeichen (<b>+<\/b>\/<b>&#8211;<\/b>), gegebenenfalls mit Angabe eines Expontenten (<b>e<\/b>\/<b>E<\/b>).<\/li>\n<\/ul>\n<p>Au&szlig;erdem kann der Wert eines <b>JSON<\/b>-Elements, wie bereits oben in den Beispielen angef&uuml;hrt, ein weiteres Element oder ein Array von Elementen sein &#8211; unter <b>http:\/\/www.json.org\/ <\/b>wird dies sch&ouml;n dargestellt.<\/p>\n<p>Damit ist ein <b>JSON<\/b>-Element zwar nicht durch eine einfache Routine zu parsen, aber der Aufwand h&auml;lt sich dennoch in Grenzen.<\/p>\n<p>In der Beispieldatenbank finden Sie die nachfolgend vorgestellten Funktionen zum Parsen eines <b>JSON<\/b>-Dokuments im Modul <b>mdlJSONParser<\/b>.<\/p>\n<p><b>Ergebnis nach dem Parsen<\/b><\/p>\n<p>Bevor man sich an die Programmierung eines Parsers begibt, sollte man sich zun&auml;chst Gedanken dar&uuml;ber machen, welches Ergebnis man erhalten m&ouml;chte und wie man dieses weiter verarbeiten kann.<\/p>\n<p>Ein <b>JSON<\/b>-Element enth&auml;lt im einfachsten Fall einfache Informationen, die man beispielsweise in einen Datensatz einer Tabelle schreibt, in anderen F&auml;llen aber auch verschachtelte Elemente, f&uuml;r deren Speicherung man eine Reihe verkn&uuml;pfter Tabellen ben&ouml;tigen w&uuml;rde. Dies ist ja bereits bei dem Beispiel mit der Person und ihren Hobbys der Fall (siehe oben).<\/p>\n<p>Sie werden die Daten aber nicht immer in eine oder mehrere Tabellen schreiben wollen, sondern m&ouml;chten diese vielleicht auch einmal ad hoc auswerten.<\/p>\n<p>Vielleicht m&ouml;chten Sie dabei noch nicht einmal auf alle Daten zugreifen, sondern nur bestimmte Elemente auslesen.<\/p>\n<p>Dies ist beispielsweise der Fall, wenn Sie ein <b>JSON<\/b>-Dokument von einem Webservice erhalten und etwa den Fehlercode auslesen m&ouml;chten. Rufen Sie beispielsweise einmal im Internet-Browser die folgende URL auf:<\/p>\n<pre>https:\/\/graph.facebook.com\/me\/feed<\/pre>\n<p>Dann erhalten Sie von Facebook das folgende <b>JSON<\/b>-Dokument als Antwort:<\/p>\n<pre>{\r\n    \"error\": {\r\n       \"message\": \"An active access token must be used to query information about the current user.\",\r\n       \"type\": \"OAuthException\",\r\n       \"code\": 2500\r\n    }\r\n}<\/pre>\n<p>In diesem Fall m&ouml;chten Sie vielleicht nur auf den Wert des Attributs <b>code <\/b>zugreifen. Wie kann man die Informationen nach dem Parsen also am besten zug&auml;nglich machen<\/p>\n<p>Wenn Sie immer mit den gleichen Strukturen arbeiten, k&ouml;nnten Sie dies beispielsweise mit einer oder mehreren Klassen erledigen, die Sie mit den entsprechenden Eigenschaften versehen. Bei vielen verschiedenen Aufrufen der Funktionen eines Webservices w&uuml;rde dies jedoch den Rahmen sprengen &#8211; wir ben&ouml;tigen eine flexiblere Variante.<\/p>\n<p><b>Speichern des geparsten JSON-Dokuments in Collections<\/b><\/p>\n<p>Die L&ouml;sung ist das <b>Collection<\/b>-Objekt: Es bietet genau die M&ouml;glichkeiten, die f&uuml;r die Unterbringung der in einem <b>JSON<\/b>-Dokument enthaltenen Informationen n&ouml;tig sind. In diesem Fall bedeutet dies:<\/p>\n<ul>\n<li>das Objekt soll Name-Wert-Paare speichern,<\/li>\n<li>als Wert sollen auch weitere Objekte gespeichert werden k&ouml;nnen und<\/li>\n<li>es sollen mehrere gleichartige Name-Wert-Paare ber&uuml;cksichtig werden k&ouml;nnen.<\/li>\n<\/ul>\n<p>F&uuml;r das erste Beispiel von oben sieht dies beispielsweise wie in Listing 1 aus. Zun&auml;chst deklarieren und instanzieren Sie das Objekt:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>colPerson<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Dim <\/span>colBeitrag<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Set<\/span> colPerson = <span style=\"color:blue;\">New<\/span> Collection\r\ncolPerson.Add \"Andr&eacute;\", \"Vorname\"\r\ncolPerson.Add \"Minhorst\", \"Nachname\"\r\n<span style=\"color:blue;\">Set<\/span> colBeitrag = <span style=\"color:blue;\">New<\/span> Collection\r\n<span style=\"color:blue;\">With<\/span> colBeitrag\r\n     .Add \"JSON parsen mit VBA\", \"Titel\"\r\n     .Add \"4\/2013\", \"Ausgabe\"\r\n     .Add colPerson, \"Autor\"\r\nEnd <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">Debug.Print<\/span> \"Titel:\", colBeitrag(\"Titel\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> \"Ausgabe:\", colBeitrag(\"Ausgabe\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> \"Autor:\", colBeitrag(\"Autor\")(\"Vorname\"), colBeitrag(\"Autor\")(\"Nachname\")<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Hinzuf&uuml;gen und Abrufen von Collection-Elementen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Set<\/span> col = <span style=\"color:blue;\">New<\/span> Collection<\/pre>\n<p>Dann f&uuml;gen Sie die Name-Wert-Paare hinzu, wobei der Wert zuerst f&uuml;r den Parameter <b>Item <\/b>und dann der Name f&uuml;r den Parameter <b>Key <\/b>angegeben wird:<\/p>\n<pre>col.Add \"Andr&eacute;\", \"Vorname\"\r\ncol.Add \"Minhorst\", \"Nachname\"<\/pre>\n<p>Schlie&szlig;lich k&ouml;nnen Sie die Werte einfach &uuml;ber den Namen abfragen &#8211; sowohl &uuml;ber die Syntax mit Ausrufezeichen als auch als Auflistungselement:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> col!Vorname, col!Nachname\r\n<span style=\"color:blue;\">Debug.Print<\/span> col(\"Vorname\"), col(\"Nachname\")<\/pre>\n<p>Im zweiten Beispiel mit dem Autor als Unterobjekt sieht der Einsatz des <b>Collection<\/b>-Objekts wie in Listing 3 aus.<\/p>\n<p>Hier deklarieren wir zwei Objekte &#8211; eines f&uuml;r den Artikel und eines f&uuml;r den Autor des Artikels. Beide werden zun&auml;chst mit den als Zeichenkette vorliegenden Daten gef&uuml;llt, bevor die eine <b>Collection<\/b> der anderen als weiterer Eintrag hinzugef&uuml;gt wird. Interessant wird der Zugriff auf die in den <b>Collection<\/b>-Objekten enthaltenen Daten. Auf <b>Titel <\/b>und <b>Autor <\/b>greifen Sie wie gewohnt zu. Auf die Unterelemente k&ouml;nnen Sie ebenfalls per Ausrufezeichen-Referenzierung und &uuml;ber die Auflistung zugreifen &#8211; die verschiedenen <b>Collection<\/b>-Objekte werden dabei einfach aneinandergereiht. Im Falle eines Datenfeldes hilft das <b>Collection<\/b>-Objekt ebenfalls weiter. Hier legen Sie wiederum eine Collection f&uuml;r die Personen-Daten an und eines f&uuml;r die Hobbys.<\/p>\n<p>Die Hobbys werden der Collection <b>colHobbys <\/b>nacheinander hinzugef&uuml;gt, wobei wir einen durchnummerierten Schl&uuml;ssel verwenden (<b>Hobby1<\/b>, <b>Hobby2 <\/b>und <b>Hobby3<\/b>).<\/p>\n<p>Diese k&ouml;nnen Sie sp&auml;ter bei der Referenzierung der enthaltenen Texte verwenden. Sie k&ouml;nnen aber auch direkt &uuml;ber die Auflistung des <b>Collection<\/b>-Objekts Hobbys darauf zugreifen &#8211; s.-Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>colPerson<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Dim <\/span>colHobbys<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n<span style=\"color:blue;\">Set<\/span> colPerson = <span style=\"color:blue;\">New<\/span> Collection\r\ncolPerson.Add \"Andr&eacute;\", \"Vorname\"\r\ncolPerson.Add \"Minhorst\", \"Nachname\"\r\n<span style=\"color:blue;\">Set<\/span> colHobbys = <span style=\"color:blue;\">New<\/span> Collection\r\n<span style=\"color:blue;\">With<\/span> colHobbys\r\n     .Add \"Lesen\", \"Hobby1\"\r\n     .Add \"Reiten\", \"Hobby2\"\r\n     .Add \"Programmieren\", \"Hobby3\"\r\nEnd <span style=\"color:blue;\">With<\/span>\r\ncolPerson.Add colHobbys, \"Hobbys\"\r\n<span style=\"color:blue;\">Debug.Print<\/span> colPerson!Vorname, colPerson!Nachname\r\n<span style=\"color:blue;\">Debug.Print<\/span> colPerson!Hobbys!Hobby1\r\n<span style=\"color:blue;\">Debug.Print<\/span> colPerson!Hobbys!Hobby2\r\n<span style=\"color:blue;\">Debug.Print<\/span> colPerson!Hobbys!Hobby3\r\nFor i = 1 To 3\r\n     <span style=\"color:blue;\">Debug.Print<\/span> _\r\n        colPerson!Hobbys(\"Hobby\" & i)\r\n<span style=\"color:blue;\">Next<\/span> i\r\nFor i = 1 To 3\r\n     <span style=\"color:blue;\">Debug.Print<\/span> colPerson!Hobbys(i)\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Zugriff auf eine Collection mit mehreren gleichartigen Elementen<\/span><\/b><\/p>\n<p>Da es unter <b>JSON <\/b>keine anderen Strukturen gibt, reicht das <b>Dictionary<\/b>-Objekt also v&ouml;llig aus, um die in einem <b>JSON<\/b>-Dokument enthaltenen Daten zu speichern und zu referenzieren.<\/p>\n<p>Fehlt nur noch der Code, um das <b>JSON<\/b>-Dokument zu parsen und in ein oder mehrere <b>Collection<\/b>-Objekte zu schreiben.<\/p>\n<p><b>JSON parsen<\/b><\/p>\n<p>Die nachfolgend vorgestellten Prozeduren und Funktionen lehnen sich weitgehend an ein im Internet gefundenes Beispiel an (siehe <b>https:\/\/code.google.com\/p\/vba-json\/<\/b>). Wir haben dort jedoch ein paar &auml;nderungen vorgenommen &#8211; zum Beispiel, um die Referenzierung der Objekte im Direktbereich anzuzeigen.<\/p>\n<p>Den Beginn macht die Funktion <b>JSONParsen<\/b>, welche das <b>JSON<\/b>-Dokument als Parameter erwartet (s. Listing 3). Diese Routine ruft zun&auml;chst eine weitere Funktion auf, welche &uuml;berfl&uuml;ssige Steuerzeichen entfernt &#8211; wie beispielsweise Zeilenumbr&uuml;che oder Leerzeichen au&szlig;erhalb der Zeichenketten.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>JSONParsen(strJSON<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>l<span style=\"color:blue;\"> As Long<\/span>\r\n     strJSON = SteuerzeichenUndLeerzeichenEntfernen(strJSON)\r\n     l = 1\r\n     Select Case <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n         <span style=\"color:blue;\">Case <\/span>\"{\"\r\n             <span style=\"color:blue;\">Set<\/span> JSONParsen = NameWertParsen(strJSON, l)\r\n         <span style=\"color:blue;\">Case <\/span>\"[\"\r\n             <span style=\"color:blue;\">Set<\/span> JSONParsen = ListeParsen(strJSON, 1)\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Parsen eines JSON-Dokuments<\/span><\/b><\/p>\n<p><b>Steuerzeichen entfernen<\/b><\/p>\n<p>Diese Funktion hei&szlig;t <b>SteuerzeichenUndLeerzeichenEntfernen<\/b> und sieht wie in Listing 4 aus. Die Funktion erwartet die zu &auml;ndernde Zeichenkette als Parameter und durchl&auml;uft diese Zeichen f&uuml;r Zeichen. Das aktuelle Zeichen speichert die Prozedur jeweils in der Variablen <b>strAktuell<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SteuerzeichenUndLeerzeichenEntfernen(strJSON<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>l<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolAnfuehrungszeichen<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strAktuell<span style=\"color:blue;\"> As String<\/span>\r\n     For l = 1 To <span style=\"color:blue;\">Len<\/span>(strJSON)\r\n         strAktuell = <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n         <span style=\"color:blue;\">If <\/span>strAktuell = \"\"\"\"<span style=\"color:blue;\"> Then<\/span>\r\n             bolAnfuehrungszeichen = <span style=\"color:blue;\">Not<\/span> bolAnfuehrungszeichen\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IstSteuerzeichen(strAktuell)<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span>strAktuell = \" \"<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>bolAnfuehrungszeichen<span style=\"color:blue;\"> Then<\/span>\r\n                     strTemp = strTemp & strAktuell\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strTemp = strTemp & strAktuell\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> l\r\n     SteuerzeichenUndLeerzeichenEntfernen = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Entfernen der Steuerzeichen aus einer Zeichenkette<\/span><\/b><\/p>\n<p>Die Prozedur soll Steuer- und Leerzeichen nur au&szlig;erhalb der eigentlichen Werte des <b>JSON<\/b>-Dokuments entfernen. Da diese Werte entweder in Anf&uuml;hrungszeichen eingefasst sind oder aber keine Leerzeichen enthalten (Zahlen et cetera), muss f&uuml;r jedes Zeichen zun&auml;chst gepr&uuml;ft werden, ob es sich innerhalb oder au&szlig;erhalb einer mit Anf&uuml;hrungszeichen eingefassten Zeichenkette befindet.<\/p>\n<p>Deshalb pr&uuml;ft die Prozedur f&uuml;r jedes Zeichen, ob es sich dabei im ein Anf&uuml;hrungszeichen handelt. Falls ja, wird die Variable <b>bolAnfuehrungszeichen <\/b>beim ersten Aufeinandertreffen mit einem Anf&uuml;hrungszeichen auf den Wert <b>True <\/b>eingestellt.<\/p>\n<p>Bei jedem folgenden Anf&uuml;hrungszeichen stellt die Prozedur <b>bolAnfuehrungszeichen <\/b>auf <b>True<\/b>, wenn diese Variable vorher den Wert <b>False <\/b>hatte und umgekehrt. So kann die Prozedur jederzeit ermitteln, ob sich das aktuelle Zeichen innerhalb von Anf&uuml;hrungszeichen befindet.<\/p>\n<p>Die folgende Zeile pr&uuml;ft anhand der Funktion <b>IstSteuerzeichen<\/b>, ob es sich bei dem Zeichen um eines der Steuerzeichen <b>vbCrLf<\/b>, <b>vbCr<\/b>, <b>vbLf <\/b>oder <b>vbTab <\/b>handelt (s. Listing 5). Ist dies der Fall, geschieht nichts. Anderenfalls k&ouml;nnen zwei interessante F&auml;lle vorliegen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstSteuerzeichen(strZeichen<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     Select Case strZeichen\r\n         <span style=\"color:blue;\">Case <\/span><span style=\"color:blue;\">vbCrLf<\/span>, <span style=\"color:blue;\">vbCr<\/span>, <span style=\"color:blue;\">vbLf<\/span>, vbTab\r\n             IstSteuerzeichen = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Steuerzeichen finden<\/span><\/b><\/p>\n<ul>\n<li>Ist das Zeichen ein Leerzeichen, wird dieses zur tempor&auml;ren Variablen <b>strTemp <\/b>hinzugef&uuml;gt &#8211; aber nur, wenn sich dieses nicht innerhalb einer durch Anf&uuml;hrungszeichen eingefassten Zeichenkette befindet.<\/li>\n<li>Jedes andere Zeichen wird zu <b>strTemp <\/b>hinzugef&uuml;gt.<\/li>\n<\/ul>\n<p>Auf diese Weise stellt <b>SteuerzeichenUndLeerzeichenEntfernen <\/b>eine neue Zeichenkette aus allen Zeichen des <b>JSON<\/b>-Dokuments zusammen, die kein Steuerzeichen und kein Leerzeichen au&szlig;erhalb geschlossener Anf&uuml;hrungszeichen sind. Warum das Ganze Weil <b>JSON<\/b>-Dokumente der besseren Lesbarkeit halber gern mit Zeilenumbr&uuml;chen und Einr&uuml;ckungen gesendet werden (s. Bild 1), die beim sp&auml;teren Parsen aber eher st&ouml;ren w&uuml;rden. Daher extrahieren wir diese in einem ersten Schritt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_893_001.png\" alt=\"Ein JSON-Dokument im Webbrowser\" width=\"570\" height=\"194,4393\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ein JSON-Dokument im Webbrowser<\/span><\/b><\/p>\n<p>Danach geht es mit der zuerst aufgerufenen Funktion <b>JSONParsen <\/b>weiter. Die Prozedur hat eine Laufvariable namens <b>l <\/b>des Datentyps <b>Long <\/b>deklariert, welche die aktuelle Position beim Durchlaufen des <b>JSON<\/b>-Dokuments markiert. Beim eigentlichen Parsen betrachten wir also wiederum Zeichen f&uuml;r Zeichen.<\/p>\n<p>Das erste Zeichen eines <b>JSON<\/b>-Dokuments muss eine &ouml;ffnende geschweifte oder eckige Klammer sein (<b>{<\/b> oder <b>[<\/b>). Im Falle einer geschweiften Klammer beginnt das Dokument mit einem einfachen Element, bei einer eckigen Klammer enth&auml;lt das Dokument ein Array von Elementen.<\/p>\n<p>Bei der geschweiften Klammer f&auml;hrt die Routine mit dem Aufruf der Funktion <b>NameWertParsen <\/b>fort, bei einer eckigen Klammer mit <b>ListeParsen<\/b>. Das Ergebnis kommt in jedem Falle in Form eines <b>Collection<\/b>-Objekts, das auch gleich als Funktionswert an die aufrufende Instanz weitergegeben wird.<\/p>\n<p><b>Name-Wert-Elemente parsen<\/b><\/p>\n<p>Der einfache Fall eines Name-Wert-Elements sieht etwa so aus:<\/p>\n<pre>{\"Beispielname\":\"Beispielwert\"}<\/pre>\n<p>Die Prozedur <b>NameWertParsen <\/b>(s. Listing 6) geht damit wie folgt vor: Sie durchl&auml;uft die mit <b>strJSON <\/b>&uuml;bergebene Zeichenkette, die beispielsweise wie im Beispiel oben aussieht, in einer <b>Do While<\/b>-Schleife, bis sie auf eine schlie&szlig;ende geschweifte Klammer st&ouml;&szlig;t.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>NameWertParsen(strJSON<span style=\"color:blue;\"> As String<\/span>, l<span style=\"color:blue;\"> As Long<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strSchluesselParent<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>strSchluessel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> col = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1) = \"}\"\r\n         l = l + 1\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1) = \",\"<span style=\"color:blue;\"> Then<\/span>\r\n             l = l + 1\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         strSchluessel = SchluesselParsen(strJSON, l)\r\n         col.Add WertParsen(strJSON, l, strSchluesselParent & \"!\" _\r\n             & strSchluessel), strSchluessel\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     l = l + 1\r\n     <span style=\"color:blue;\">Set<\/span> NameWertParsen = col\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Parsen von Name-Wert-Paaren<\/span><\/b><\/p>\n<p>Innerhalb der <b>Do While<\/b>-Schleife wird die Z&auml;hler-Variable <b>l <\/b>jeweils um eins erh&ouml;ht.  Die Funktion wei&szlig;, dass hinter der geschweiften Klammer immer zun&auml;chst der Schl&uuml;ssel beziehungsweise Name des Elements folgt (im Beispiel <b>Beispielname<\/b>). Dieser wird in der Funktion <b>SchluesselParsen <\/b>ermittelt (s. Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>SchluesselParsen(strJSON<span style=\"color:blue;\"> As String<\/span>, l<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSchluessel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolAnfuehrungszeichen<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> l &gt; 0 And l &lt;= <span style=\"color:blue;\">Len<\/span>(strJSON)\r\n         Select Case <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n             <span style=\"color:blue;\">Case <\/span>\"\"\"\"\r\n                 bolAnfuehrungszeichen = <span style=\"color:blue;\">Not<\/span> bolAnfuehrungszeichen\r\n                 l = l + 1\r\n             <span style=\"color:blue;\">Case <\/span>\":\"\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolAnfuehrungszeichen<span style=\"color:blue;\"> Then<\/span> \r\n                     l = l + 1\r\n                     <span style=\"color:blue;\">Exit Do<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 strSchluessel = strSchluessel & <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n                 l = l + 1\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     SchluesselParsen = strSchluessel\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Ermitteln des Schl&uuml;ssels eines Elements<\/span><\/b><\/p>\n<p>Diese erwartet das <b>JSON<\/b>-Dokument sowie die aktuelle Position als Parameter. Sie durchl&auml;uft die in <b>strJSON<\/b> gespeicherte Zeichenkette h&ouml;chstens vom ersten bis zum letzten Zeichen. Dabei treten drei verschiedene F&auml;lle auf:<\/p>\n<ul>\n<li>Das Zeichen ist ein Anf&uuml;hrungszeichen (<b>&#8222;<\/b>). Dies stellt die Variable <b>bolAnfuehrungszeichen <\/b>im ersten Durchlauf auf den Wert <b>True <\/b>ein, sonst auf den jeweils entgegengesetzten Wert. Au&szlig;erdem wird <b>l <\/b>um eins erh&ouml;ht.<\/li>\n<li>Das Zeichen ist ein Doppelpunkt (<b>:<\/b>). In diesem Fall pr&uuml;ft die Prozedur, ob das aktuelle Zeichen sich innerhalb eines Paares von Anf&uuml;hrungszeichen befindet. Ist dies der Fall, ist der Doppelpunkt Teil des Elementnamens. Befindet sich der Doppelpunkt sich jedoch hinter dem schlie&szlig;enden Anf&uuml;hrungszeichen, ist das Ende des Elementnamens erreicht und es beginnt der Elementwert. Die Funktion kehrt dann zur aufrufenden Prozedur zur&uuml;ck.<\/li>\n<li>In allen anderen F&auml;llen wird die Variable <b>str-Schlues-sel<\/b>, die den Elementnamen aufnimmt, um das jeweilige Zeichen erweitert und der Z&auml;hler l um eins erh&ouml;ht.<\/li>\n<\/ul>\n<p>Schlie&szlig;lich gibt die Funktion den in <b>strSchluessel <\/b>zusammengesetzten Wert an die aufrufende Routine zur&uuml;ck. Damit sind wir wieder mittendrin in der Funktion <b>NameWertParsen<\/b>. Diese hat nun den Schl&uuml;ssel, ben&ouml;tigt aber noch den Wert, um einen ersten Eintrag im <b>Collection<\/b>-Objekt anzulegen.<\/p>\n<p>Dies geschieht in der n&auml;chsten Anweisung, wo gleichzeitig der Wert ermittelt und der neue Eintrag im <b>Collection<\/b>-Objekt erzeugt wird. Der zweite Parameter der dort verwendeten <b>Add<\/b>-Methode der Collection <b>col <\/b>ist der in <b>strSchluessel <\/b>gespeicherte Name des Elements. Der Wert wird direkt als erster Parameter &uuml;bergeben, und zwar mit der Funktion <b>WertParsen<\/b>:<\/p>\n<pre>col.Add WertParsen(strJSON, l,  strSchluesselParent  & \"!\" & strSchluessel), strSchluessel<\/pre>\n<p>Das Ergebnis der Funktion <b>WertParsen <\/b>weisen wir direkt als Wert des <b>Collection<\/b>-Elements zu, weil es sowohl eine Zeichenkette als auch ein Zahlenwert oder ein weiteres <b>Collection<\/b>-Objekt sein kann.<\/p>\n<p>Die Funktion <b>WertParsen <\/b>sieht wie in Listing 8 aus und ist im Grunde nur eine Weiterleitung zu einer von mehreren weiteren Funktionen, die typ-abh&auml;ngig das neue Element zur&uuml;ckliefern.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>WertParsen(strJSON<span style=\"color:blue;\"> As String<\/span>, l<span style=\"color:blue;\"> As Long<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strSchluessel<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Variant<\/span>\r\n     Select Case <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n         <span style=\"color:blue;\">Case <\/span>\"\"\"\", \"''\"\r\n             WertParsen = ZeichenketteParsen(strJSON, l)\r\n             <span style=\"color:blue;\">Debug.Print<\/span> strSchluessel & \" = \" & WertParsen\r\n         <span style=\"color:blue;\">Case <\/span>\"{\"\r\n             <span style=\"color:blue;\">Set<\/span> WertParsen = NameWertParsen(strJSON, l, strSchluessel)\r\n         <span style=\"color:blue;\">Case <\/span>\"[\"\r\n             <span style=\"color:blue;\">Set<\/span> WertParsen = ListeParsen(strJSON, l, strSchluessel)\r\n         <span style=\"color:blue;\">Case <\/span>\"t\", \"f\"\r\n             WertParsen = BooleanParsen(strJSON, l)\r\n             <span style=\"color:blue;\">Debug.Print<\/span> strSchluessel & \" = \" & WertParsen\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             WertParsen = ZahlParsen(strJSON, l)\r\n             <span style=\"color:blue;\">Debug.Print<\/span> strSchluessel & \" = \" & WertParsen\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Wert eines Elements ermitteln<\/span><\/b><\/p>\n<p>Die Funktion erwartet nicht nur eine <b>String<\/b>-Variable mit dem <b>JSON<\/b>-Dokument und die aktuelle Position als Parameter, sondern auch noch eine optionale Variable namens <b>strSchluessel<\/b>. Sie gibt eine Variable vom Typ <b>Variant <\/b>zur&uuml;ck.<\/p>\n<p>Warum diese Variable <b>strSchluessel<\/b> Diese dient lediglich dem Zweck, beim Parsen des <b>JSON<\/b>-Objekts eine Liste der Verweise auf die einzelnen Elemente im Direktfenster auszugeben &#8211; dazu sp&auml;ter mehr. Diese Funktion durchl&auml;uft ausnahmsweise mal nicht mehrere Zeichen des <b>JSON<\/b>-Dokuments, sondern pr&uuml;ft nur das erste Zeichen des Elements &#8211; also das Zeichen hinter dem Doppelpunkt, der daf&uuml;r gesorgt hat, dass die Funktion <b>SchluesselParsen <\/b>verlassen wurde. Dabei k&ouml;nnen folgende Ergebnisse auftreten:<\/p>\n<ul>\n<li>Das Zeichen ist, wie im einfachen Beispiel von oben, ein Anf&uuml;hrungszeichen (<b>{&#8222;Beispielname&#8220;:&#8220;Beispielwert&#8220;}<\/b>). In diesem Fall wird der Wert mit der Funktion <b>ZeichenketteParsen <\/b>eingelesen.<\/li>\n<li>Das Zeichen ist eine &ouml;ffnende geschweifte Klammer. Das bedeutet, dass dieses Objekt ein weiteres Objekt enth&auml;lt &#8211; und dies wird wiederum rekursiv mit der Funktion <b>NameWertParsen <\/b>untersucht.<\/li>\n<li>Das Zeichen ist eine &ouml;ffnende eckige Klammer. In diesem Fall ruft die Routine die Funktion <b>ListeParsen <\/b>auf, um die Liste abzuarbeiten und das <b>Collection<\/b>-Objekt zur&uuml;ckzuliefern, das die Listeneintr&auml;ge enth&auml;lt.<\/li>\n<li>Das Zeichen ist ein <b>t <\/b>oder ein <b>f <\/b>&#8211; dann folgt nun wahrscheinlich der Ausdruck <b>true <\/b>oder <b>false<\/b>. Dies ruft die Funktion <b>BooleanParsen <\/b>auf den Plan.<\/li>\n<li>Treffen die vorherigen M&ouml;glichkeiten nicht zu, handelt es sich um eine Zahl. Diese wird mit der Funktion <b>ZahlParsen <\/b>analysiert.<\/li>\n<\/ul>\n<p><b>Zeichenkette als Wert parsen<\/b><\/p>\n<p>Die Funktion <b>ZeichenketteParsen<\/b> finden Sie in Listing 9. Sie erwartet das JSON-Dokument und die aktuelle Position als Parameter (dies tun die nachfolgend beschriebenen weiteren Funktionen ebenfalls). Der Wert wird in der Variablen <b>strTemp <\/b>gespeichert. Die Funktion durchl&auml;uft das <b>JSON<\/b>-Dokument von der aktuellen Position aus notfalls bis zum Ende.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>ZeichenketteParsen(strJSON<span style=\"color:blue;\"> As String<\/span>, l<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCode<span style=\"color:blue;\"> As String<\/span>\r\n     l = l + 1\r\n     <span style=\"color:blue;\">Do While<\/span> l &gt; 0 And l &lt;= <span style=\"color:blue;\">Len<\/span>(strJSON)\r\n         Select Case <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n             <span style=\"color:blue;\">Case <\/span>\"\\\"\r\n                 l = l + 1\r\n                 Select Case <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n                     <span style=\"color:blue;\">Case <\/span>\"\"\"\", \"\\\", \"\/\"\r\n                         strTemp = strTemp & <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n                         l = l + 1\r\n                     <span style=\"color:blue;\">Case <\/span>\"b\"\r\n                         strTemp = strTemp & vbBack\r\n                         l = l + 1\r\n                     <span style=\"color:blue;\">Case <\/span>\"f\"\r\n                         strTemp = strTemp & vbFormFeed\r\n                         l = l + 1\r\n                     <span style=\"color:blue;\">Case <\/span>\"n\"\r\n                         strTemp = strTemp & <span style=\"color:blue;\">vbLf<\/span>\r\n                         l = l + 1\r\n                     <span style=\"color:blue;\">Case <\/span>\"r\"\r\n                         strTemp = strTemp & <span style=\"color:blue;\">vbCr<\/span>\r\n                         l = l + 1\r\n                     <span style=\"color:blue;\">Case <\/span>\"t\"\r\n                         strTemp = strTemp & vbTab\r\n                         l = l + 1\r\n                     <span style=\"color:blue;\">Case <\/span>\"u\"\r\n                         l = l + 1\r\n                         strCode = <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 4)\r\n                         strTemp = strTemp & ChrW(Val(\"&h\" + strCode))\r\n                         l = l + 4\r\n                 <span style=\"color:blue;\">End Select<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>\"\"\"\"\r\n                 l = l + 1\r\n                 <span style=\"color:blue;\">Exit Do<\/span>\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 strTemp = strTemp & <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1)\r\n                 l = l + 1\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     ZeichenketteParsen = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Parsen einer Zeichenkette als Wert eines Elements<\/span><\/b><\/p>\n<p>Bis dahin untersucht sie das jeweils aktuelle Zeichen auf folgende Vorkommen:<\/p>\n<ul>\n<li>Backslash (<b>\\<\/b>): Dies leitet normalerweise ein Sonderzeichen ein, das sonst eine bestimmte Funktion hat. Folgende Backslashes, Anf&uuml;hrungszeichen und Slashes werden einfach zur Zeichenkette hinzugef&uuml;gt. Andere Kombinationen wie etwa <b>\\n <\/b>werden in die entsprechenden Steuercodes umgewandelt.<\/li>\n<li>Um Falle der Kombination <b>\\u <\/b>folgt ein vierstelliger Zahlencode, der ein Sonderzeichen repr&auml;sentiert. Dieses wird durch die Funktion <b>ChrW <\/b>entsprechend interpretiert.<\/li>\n<li>Neben dem Backslash kann auch ein Anf&uuml;hrungszeichen auftauchen. Dies ist das Ende der Zeichenkette, die als Wert dient &#8211; die Schleife wird beim Auftreten dieses Zeichens verlassen und die Funktion liefert den ermittelten Wert als Funktionswert an die aufrufende Routine.<\/li>\n<li>Schlie&szlig;lich gibt es noch einen <b>Case<\/b>-Zweig f&uuml;r alle &uuml;brigen Zeichen: Diese werden einfach an die in der Variablen <b>strTemp <\/b>gespeicherte Zeichenkette angeh&auml;ngt.<\/li>\n<\/ul>\n<p>Im ersten einfachen Beispiel w&uuml;rde die Funktion  <b>NameWertParsen <\/b>nun einen <b>Collection<\/b>-Eintrag mit dem Schl&uuml;ssel <b>Beispielname <\/b>und dem Wert <b>Beispielschl&uuml;ssel <\/b>erzeugen und die Collection an die aufrufende Funktion <b>JSONParsen <\/b>zur&uuml;ckgeben, die den Wert ihrerseits als Funktionswert liefert.<\/p>\n<p>Die aufrufende Instanz k&ouml;nnte die Collection nun etwa in einer Variablen namens <b>objJSON <\/b>speichern und beispielsweise wie folgt auf den Wert zugreifen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> objJSON!Beispielname\r\n<span style=\"color:blue;\">Debug.Print<\/span> objJSON(\"Beispielname\")<\/pre>\n<p>Dies gilt auch, wenn das <b>JSON<\/b>-Dokument mehrere Eintr&auml;ge in der ersten Ebene enth&auml;lt.<\/p>\n<p><b>Weitere Werte parsen<\/b><\/p>\n<p>Die Funktionen zum Parsen von Boolean-Werten und Zahlenwerten sind &auml;hnlich aufgebaut wie die zum Parsen von Zeichenketten. Sie finden diese unter den Namen <b>BooleanParsen <\/b>und <b>ZahlParsen <\/b>im Modul <b>mdlJSONParsen <\/b>der <b>Beispieldatenbank<\/b>.<\/p>\n<p><b>Untergeordnetes Element parsen<\/b><\/p>\n<p>Wenn das zu untersuchende Dokument ein Element enth&auml;lt, das als Wert seinerseits ein Element enth&auml;lt, sieht das so aus:<\/p>\n<pre>{\"Schluessel\":{\"Unterschluessel\":\"Wert\"}}<\/pre>\n<p>St&ouml;&szlig;t die Funktion <b>WertParsen <\/b>beim Untersuchen des ersten Zeichens des Wertes auf die &ouml;ffnende geschweifte Klammer, ruft sie erneut die Funktion <b>NameWertParsen <\/b>auf.<\/p>\n<p>Diese beginnt den Vorgang nun von vorn, wodurch erst ein <b>Collection<\/b>-Objekt mit dem Name-Wert-Paar <b>Unterschluessel<\/b>\/<b>Wert <\/b>erzeugt wird und dieses dann als Wert des Eintrags <b>Schluessel <\/b>eines &uuml;bergeordneten <b>Collection<\/b>-Objekts eingef&uuml;gt wird.<\/p>\n<p><b>Array parsen<\/b><\/p>\n<p>Sollte die Funktion <b>WertParsen <\/b>ermitteln, dass es sich beim Wert um eine Liste weiterer Elemente handelt, dann ruft dies die Funktion <b>ListeParsen<\/b> aus Listing 10 auf den Plan. Ein einfaches Beispiel f&uuml;r eine solche Liste sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ListeParsen(strJSON<span style=\"color:blue;\"> As String<\/span>, l<span style=\"color:blue;\"> As Long<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strSchluessel<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Set<\/span> col = <span style=\"color:blue;\">New<\/span> Collection\r\n     l = l + 1\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1) = \"]\"\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Mid<\/span>(strJSON, l, 1) = \",\"<span style=\"color:blue;\"> Then<\/span>\r\n             l = l + 1\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         col.Add WertParsen(strJSON, l, strSchluessel & \"(\" & col.Count & \")\")\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     l = l + 1\r\n     <span style=\"color:blue;\">Set<\/span> ListeParsen = col\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Parsen einer Elementliste eines JSON-Dokuments<\/span><\/b><\/p>\n<pre>{\"Schluessel\":[\"Wert1\",\"Wert2\",\"Wert3\"]}<\/pre>\n<p>Die Funktion <b>ListeParsen <\/b>w&uuml;rde dann wiederum alle Zeichen vom aktuellen Zeichen bis zur schlie&szlig;enden eckigen Klammer durchlaufen, die das Ende der Auflistung markiert.<\/p>\n<p>Vorher kann es noch vorkommen, dass die Funktion auf ein Komma trifft &#8211; dies bedeutet, dass ein neues Element der Auflistung beginnt.<\/p>\n<p>In allen anderen F&auml;llen soll die Funktion <b>WertParsen <\/b>den mit der aktuellen Position beginnenden Wert einlesen und als neuen Eintrag einer Collection mit allen Listenelementen hinzuf&uuml;gen.<\/p>\n<p><b>Ausgabe der Ausdr&uuml;cke zum Referenzieren der einzelnen Elemente<\/b><\/p>\n<p>Auf diese Weise erstellen die Funktionen des Moduls <b>mdlJSONParser<\/b>, die je nach Aufbau des <b>JSON<\/b>-Dokuments durch die Funktion <b>JSONParsen <\/b>aufgerufen werden, eine Reihe verschachtelter <b>Collection<\/b>-Objekte mit entsprechenden Eintr&auml;gen.<\/p>\n<p>Nun stellt sich die Frage, wie Sie auf die Eintr&auml;ge dieser Collections zugreifen beziehungsweise wie Sie erfahren, wie die Collections &uuml;berhaupt aufgebaut sind.<\/p>\n<p>Grunds&auml;tzlich sind diese nat&uuml;rlich &auml;hnlich wie die zugrunde liegenden <b>JSON<\/b>-Dokumente gestaltet, und auch die Syntax l&auml;sst sich von diesen <b>JSON<\/b>-Dokumenten ableiten. Allerdings liefern die Funktionen noch eine Hilfe mit, die das programmatische Abfragen der einzelnen Elemente einfach gestaltet. Dazu geben diese im Direktbereich den f&uuml;r den Aufruf aller Elemente n&ouml;tigen Verweis aus. Dies sieht f&uuml;r das folgende Dokument etwa wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_893_002.png\" alt=\"Ausgabe beim Parsen eines JSON-Dokuments\" width=\"570\" height=\"144,4317\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ausgabe beim Parsen eines JSON-Dokuments<\/span><\/b><\/p>\n<pre>{\r\n   \"Vorname\":\"Andr&eacute;\",\r\n   \"Nachname\":\"Minhorst\",\r\n   \"Hobbies\":[\r\n     \"Lesen\",\r\n     \"Reiten\",\r\n     \"Programmieren\"\r\n   ],\r\n   \"Veroeffentlichungen\":[\r\n     {\r\n       \"Titel\":\"Access im Unternehmen\"\r\n     },\r\n     {\r\n       \"Titel\":\"Access [basics]\"\r\n     }\r\n   ]\r\n}<\/pre>\n<p>Wenn Sie die durch die Funktion <b>JSONParsen <\/b>zur&uuml;ckgelieferte Collection mit einer entsprechenden Objektvariablen referenzieren, k&ouml;nnen Sie mit genau den im Direktfenster abgebildeten Ausdr&uuml;cken auf die Elemente zugreifen. Um beispielsweise eine Auflistung zu durchlaufen, k&ouml;nnen Sie sich au&szlig;erdem noch der <b>For&#8230;Next<\/b>-Schleife bedienen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n<span style=\"color:blue;\">Set<\/span> col = JSONParsen(\"{\"\"Vorname\"\":...\r\nFor i = 1 To 3\r\n     <span style=\"color:blue;\">Debug.Print<\/span> col!Hobbies(i)\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Wenn Sie die Anzahl der Elemente nicht kennen, was gelegentlich beim Parsen von <b>JSON<\/b>-Dokumenten passieren d&uuml;rfte, ermitteln Sie die Anzahl einfach mit der <b>Count<\/b>-Eigenschaft:<\/p>\n<pre>For i = 1 To col!Hobbies.Count\r\n     <span style=\"color:blue;\">Debug.Print<\/span> col!Hobbies(i)\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit den hier vorgestellten Techniken k&ouml;nnen Sie <b>JSON<\/b>-Dokumente, die oft als Ergebnis von Webservices zur&uuml;ckgeliefert werden, parsen und anschlie&szlig;end &uuml;ber ein <b>Collection<\/b>-Objekt auslesen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>JSONParsen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{C42E6CCA-11D8-476D-9822-B5A959C8AE1C}\/aiu_893.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Webservices bedienen sich verschiedener Formate, um ihre Ergebnisse zu liefern. Meist wird zumindest XML angeboten, manchmal gibt es die Daten zus&auml;tzlich im JSON-Format. Beides kein Problem, da wir den Umgang mit XML-Dokumenten schon in verschiedenen Beitr&auml;gen beschrieben haben. Wenn allerdings nur JSON zur&uuml;ckgeliefert wird, m&uuml;ssen wir uns etwas einfallen lassen &#8211; es gibt n&auml;mlich kein Pendant zur MSXML-Bibliothek, mit der sich die Inhalte leicht auslesen lassen. Aber es gibt ja VBA &#8211; und damit bauen wir uns unseren eigenen Parser.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662013,66042013,44000025],"tags":[],"class_list":["post-55000893","post","type-post","status-publish","format-standard","hentry","category-662013","category-66042013","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>JSON-Dokumente mit VBA parsen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JSON-Dokumente mit VBA parsen\" \/>\n<meta property=\"og:description\" content=\"Webservices bedienen sich verschiedener Formate, um ihre Ergebnisse zu liefern. Meist wird zumindest XML angeboten, manchmal gibt es die Daten zus&auml;tzlich im JSON-Format. Beides kein Problem, da wir den Umgang mit XML-Dokumenten schon in verschiedenen Beitr&auml;gen beschrieben haben. Wenn allerdings nur JSON zur&uuml;ckgeliefert wird, m&uuml;ssen wir uns etwas einfallen lassen - es gibt n&auml;mlich kein Pendant zur MSXML-Bibliothek, mit der sich die Inhalte leicht auslesen lassen. Aber es gibt ja VBA - und damit bauen wir uns unseren eigenen Parser.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:29:29+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/b5978cb510734add810410cc52a31a2c\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"JSON-Dokumente mit VBA parsen\",\"datePublished\":\"2020-05-22T21:29:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/\"},\"wordCount\":3169,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/b5978cb510734add810410cc52a31a2c\",\"articleSection\":[\"2013\",\"4\\\/2013\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/\",\"name\":\"JSON-Dokumente mit VBA parsen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/b5978cb510734add810410cc52a31a2c\",\"datePublished\":\"2020-05-22T21:29:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/b5978cb510734add810410cc52a31a2c\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/b5978cb510734add810410cc52a31a2c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/JSONDokumente_mit_VBA_parsen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JSON-Dokumente mit VBA parsen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JSON-Dokumente mit VBA parsen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/","og_locale":"de_DE","og_type":"article","og_title":"JSON-Dokumente mit VBA parsen","og_description":"Webservices bedienen sich verschiedener Formate, um ihre Ergebnisse zu liefern. Meist wird zumindest XML angeboten, manchmal gibt es die Daten zus&auml;tzlich im JSON-Format. Beides kein Problem, da wir den Umgang mit XML-Dokumenten schon in verschiedenen Beitr&auml;gen beschrieben haben. Wenn allerdings nur JSON zur&uuml;ckgeliefert wird, m&uuml;ssen wir uns etwas einfallen lassen - es gibt n&auml;mlich kein Pendant zur MSXML-Bibliothek, mit der sich die Inhalte leicht auslesen lassen. Aber es gibt ja VBA - und damit bauen wir uns unseren eigenen Parser.","og_url":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:29:29+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/b5978cb510734add810410cc52a31a2c","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"JSON-Dokumente mit VBA parsen","datePublished":"2020-05-22T21:29:29+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/"},"wordCount":3169,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/b5978cb510734add810410cc52a31a2c","articleSection":["2013","4\/2013","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/","url":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/","name":"JSON-Dokumente mit VBA parsen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/b5978cb510734add810410cc52a31a2c","datePublished":"2020-05-22T21:29:29+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/b5978cb510734add810410cc52a31a2c","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/b5978cb510734add810410cc52a31a2c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/JSONDokumente_mit_VBA_parsen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"JSON-Dokumente mit VBA parsen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000893"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000893\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}