{"id":55000412,"date":"2023-12-01T00:00:00","date_gmt":"2023-12-19T15:03:10","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=412"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"JSONDokumente_per_Objektmodell_zusammenstellen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/JSONDokumente_per_Objektmodell_zusammenstellen\/","title":{"rendered":"JSON-Dokumente per Objektmodell zusammenstellen"},"content":{"rendered":"<p><b>Der Umgang mit JSON-Dokumenten wir immer wichtiger, da immer mehr Rest-APIs dieses Format nutzen, um Daten auszutauschen. In einem weiteren Artikel namens Mit JSON arbeiten (www.vbentwickler.de\/361) haben wir bereits gezeigt, wie wir JSON-Dokumente m&ouml;glichst einfach per VBA lesen k&ouml;nnen. Das ist schon die halbe Miete, aber die Kommunikation mit Rest-APIs ist keine Einbahnstra&szlig;e: Wir m&uuml;ssen auch immer wieder mal Daten im JSON-Format an eine Rest-API senden. Wir nutzen dazu wiederum die Bibliothek von Tim Hall, die uns eine Funktion namens ConvertToJSON zur Verf&uuml;gung stellt. Dieser m&uuml;ssen wir nun nur noch die Daten in einem entsprechenden Format &uuml;bergeben. Wie das gelingt, zeigen wir im vorliegenden Artikel.<\/b><\/p>\n<p>Im Artikel <b>Google Calendar per Rest-API programmieren <\/b>(<b>www.vbentwickler.de\/410<\/b>) hatten wir die Aufgabe, ein JSON-Dokument mit den Daten eines in Google Calendar anzulegenden Ereignisses zu erstellen. Das kann man auf die klassische Art machen, indem man dieses einfach zeilenweise als String in einer Variablen erfasst.<\/p>\n<p>Daf&uuml;r brauchen wir, wie in Listing 1 zu sehen, keine weiteren Hilfsmittel &#8211; der JSON-Ausdruck wird anschlie&szlig;end beispielsweise per <b>Debug.Print <\/b>wie folgt ausgegeben und kann so auch an die Rest-API geschickt werden:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>JSONPerString()\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     strJSON = \"{\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"  \"\"start\"\": {\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"    \"\"dateTime\"\": \"\"2023-11-22T17:00:00\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"    \"\"timeZone\"\": \"\"Europe\/Berlin\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"  },\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"  \"\"end\"\": {\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"    \"\"dateTime\"\": \"\"2023-11-22T18:30:00\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"    \"\"timeZone\"\": \"\"Europe\/Berlin\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"  },\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"  \"\"summary\"\":\"\"Summary\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"  \"\"description\"\":\"\"description\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strJSON = strJSON & \"}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strJSON\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Beispiel f&uuml;r das Erfassen eines JSON-Dokuments per String-Variable<\/span><\/b><\/p>\n<pre>{\r\n   \"start\": {\r\n     \"dateTime\": \"2023-11-22T17:00:00\",\r\n     \"timeZone\": \"Europe\/Berlin\"\r\n   },\r\n   \"end\": {\r\n     \"dateTime\": \"2023-11-22T18:30:00\",\r\n     \"timeZone\": \"Europe\/Berlin\"\r\n   },\r\n   \"summary\":\"Summary\",\r\n   \"description\":\"description\"\r\n}<\/pre>\n<p>Das Problem ist nur: Wenn wir diese Zeilen zusammenstellen wollen, ist das ein erheblicher Aufwand. <\/p>\n<p>Schauen wir uns die folgende Zeile des zu erzeugenden JSON-Dokuments an und gehen wir davon aus, dass wir das Dokument in VBA basierend auf einer Vorlage zusammenstellen wollen:<\/p>\n<pre>     \"dateTime\": \"2023-11-22T17:00:00\",<\/pre>\n<p>Dann m&uuml;ssen wir zuerst am Anfang der Zeile <b>strJSON = strJSON &#038; &#8221; <\/b>voranstellen, hinten ein <b>&#8221; &#038; vbCrLf <\/b>anf&uuml;gen und schlie&szlig;lich noch alle enthaltenen Anf&uuml;hrungszeichen verdoppeln, damit diese auch als Anf&uuml;hrungszeichen innerhalb des Variableninhalts interpretiert werden und nicht als das Ende der Zeichenkette:<\/p>\n<pre>strJSON = strJSON & \"    \"\"dateTime\"\": \"\"2023-11-22T17:00:00\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>Das ist nicht nur sehr aufwendig, wenn man es von Hand macht, sondern auch noch extrem fehleranf&auml;llig.<\/p>\n<p>Stellen wir uns dann vor, wir wollten zwischendrin eine Zeile entfernen &#8211; beispielsweise die Zeile mit dem Wert f&uuml;r das Feld <b>description<\/b>:<\/p>\n<pre>strJSON = strJSON & \"  \"\"summary\"\":\"\"Summary\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrJSON = strJSON & \"  \"\"description\"\":\"\"description\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrJSON = strJSON & \"}\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>Dann m&uuml;ssen wir hier nicht nur die Zeile entfernen, sondern auch in der vorherigen Zeile das Komma, denn sonst w&auml;re das JSON-Dokument fehlerhaft.<\/p>\n<h2>Vereinfachung dank JSON-Bibliothek<\/h2>\n<p>Hier kommt die Bibliothek beziehungsweise das Modul von Tim Hall ins Spiel, die wir zum Beispiel hier herunterladen k&ouml;nnen:<\/p>\n<pre>https:\/\/github.com\/VBA-tools\/VBA-JSON\/blob\/master\/JsonConverter.bas<\/pre>\n<p>Diese bietet einige n&uuml;tzliche Funktionen. Eine davon, <b>ParseJSON<\/b>, haben wir bereits in dem oben genannten Artikel verwendet, um aus einem JSON-Dokument ein Objekt zu generieren, das alle Elemente des JSON-Dokuments in strukturierter Form als Dictionaries und Collections enth&auml;lt.<\/p>\n<p>In diesem Artikel zeigen wir auch unsere eigene Erweiterung, mit der wir noch den Code ausgeben, den wir f&uuml;r den Zugriff auf die Elemente verwenden k&ouml;nnen. Auf die Elemente des obigen, zugegebenerma&szlig;en einfach aufgebauten JSON-Dokuments, greifen wir damit wie folgt zu:<\/p>\n<pre>objJSON.Item(\"start\").Item(\"dateTime\")\r\nobjJSON.Item(\"start\").Item(\"timeZone\")\r\nobjJSON.Item(\"end\").Item(\"dateTime\")\r\nobjJSON.Item(\"end\").Item(\"timeZone\")\r\nobjJSON.Item(\"summary\")\r\nobjJSON.Item(\"description\")<\/pre>\n<p>Wie aber k&ouml;nnen wir nun den umgekehrten Weg gehen &#8211; also den, ein JSON-Dokument &uuml;ber <b>Dictionary<\/b>&#8211; und <b>Collection<\/b>-Elemente zusammenzustellen und daraus dann mit der Funktion <b>ConvertToJSON <\/b>ein JSON-Dokument im <b>String<\/b>-Format abzuleiten? Dies schauen wir uns anhand einiger Beispiele an.<\/p>\n<h2>Objekte erstellen<\/h2>\n<p>Die wichtigste Information vorab: <\/p>\n<ul>\n<li>Eckige Klammern deuten immer auf die Auflistung von Elementen hin, diese landen in einem <b>Collection<\/b>-Objekt.<\/li>\n<li>Geschweifte Klammern weisen auf ein oder mehrere Name-Wert-Paare hin, diese landen in einem <b>Dictionary<\/b>-Objekt.<\/li>\n<\/ul>\n<h2>Einfachstes Beispiel: Ein Name-Wert-Paar<\/h2>\n<p>Im ersten Beispiel wollen wir dieses Dokument erzeugen:<\/p>\n<pre>{\r\n   \"Vorname\":\"Andre\"\r\n}<\/pre>\n<p>Dazu brauchen wir noch verh&auml;ltnism&auml;&szlig;ig viel Code:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>NameWertPaar()\r\n     <span style=\"color:blue;\">Dim <\/span>dicJSON<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     dicJSON.Add \"Vorname\", \"Andre\"\r\n     strJSON = ConvertToJson(dicJSON)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strJSON\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Mehrere Name-Wert-Paare<\/h2>\n<p>Nun wollen wir wie folgt ein oder mehrere Name-Wert-Paare hinzuf&uuml;gen:<\/p>\n<pre>{\r\n   \"Vorname\":\"Andre\",\r\n   \"Nachname\":\"Minhorst\"\r\n}<\/pre>\n<p>Dazu brauchen wir je Name-Wert-Paare nur die <b>Add<\/b>-Methode des <b>Dictionary<\/b>-Objekts erneut aufzurufen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ZweiNameWertPaare()\r\n     <span style=\"color:blue;\">Dim <\/span>dicJSON<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     dicJSON.Add \"Vorname\", \"Andre\"\r\n     dicJSON.Add \"Nachname\", \"Minhorst\"\r\n     strJSON = ConvertToJson(dicJSON)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strJSON\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir sehen: Die Hauptarbeit ist bereits getan, alle weiteren Elemente auf diese Ebene sind Einzeiler.<\/p>\n<h2>Name-Wert-Paare mit untergeordneten Elementen<\/h2>\n<p>Nun wollen wir wie folgt die Adresse hinzuf&uuml;gen, welche die Adressdaten im Element <b>Adresse <\/b>auff&uuml;hrt:<\/p>\n<pre>{\r\n   \"Vorname\":\"Andre\",\r\n   \"Nachname\":\"Minhorst\",\r\n   \"Adresse\":{\r\n     \"Strasse\":\"Borkhofer Str. 17\",\r\n     \"PLZ\":\"47137\",\r\n     \"Ort\":\"Duisburg\"\r\n   }\r\n}<\/pre>\n<p>Dazu legen wir einfach ein neues <b>Dictionary<\/b>-Element namens <b>dicAdresse <\/b>an. Dieses f&uuml;gen wir zuerst als Unterelement mit dem Namen <b>Adresse <\/b>zum Hauptelement <b>dicJSON <\/b>hinzu.<\/p>\n<p>Erst danach f&uuml;llen wir <b>dicAdresse <\/b>mit den drei Name-Wert-Paaren:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>NameWertMitUnterelementen()\r\n     <span style=\"color:blue;\">Dim <\/span>dicJSON<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>dicAdresse<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     dicJSON.Add \"Vorname\", \"Andre\"\r\n     dicJSON.Add \"Nachname\", \"Minhorst\"\r\n     dicJSON.Add \"Adresse\", dicAdresse\r\n     dicAdresse.Add \"Strasse\", \"Borkhofer Str. 17\"\r\n     dicAdresse.Add \"PLZ\", \"47137\"\r\n     dicAdresse.Add \"Ort\", \"Duisburg\"\r\n     strJSON = ConvertToJson(dicJSON)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strJSON\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies k&ouml;nnen wir endlos so weiterbetreiben. Interessant ist aber nun noch, wie wir mit mehreren gleichartigen Elementen umgehen, die in eckige Klammern eingefasst werden sollen.<\/p>\n<h2>Mehrere gleiche Objekte<\/h2>\n<p>Nun stellen wir uns vor, wir wollten mehrere Adressen f&uuml;r den Kontakt speichern &#8211; beispielsweise zwei:<\/p>\n<pre>{\r\n   \"Vorname\":\"Andre\",\r\n   \"Nachname\":\"Minhorst\",\r\n   \"Adressen\":[\r\n     {\r\n       \"Strasse\":\"Borkhofer Str. 17\",\r\n       \"PLZ\":\"47137\",\r\n       \"Ort\":\"Duisburg\"\r\n     },\r\n     {\r\n       \"Strasse\":\"Gerichtsstr. 2a\",\r\n       \"PLZ\":\"12344\",\r\n       \"Ort\":\"Testhausen\"\r\n     }\r\n   ]\r\n}<\/pre>\n<p>Daf&uuml;r ben&ouml;tigen wir nun auch zwei <b>Dictionary<\/b>-Elemente namens <b>dicAdresse1<\/b> und <b>dicAdresse2<\/b>. Diese f&uuml;gen wir einem <b>Collection<\/b>-Element namens <b>colAdressen<\/b> hinzu, das wir wiederum dem Element <b>Adressen <\/b>untergeordnet haben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>NameWertMitMehrerenGleichenUnterelementen()\r\n     <span style=\"color:blue;\">Dim <\/span>dicJSON<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>colAdressen<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dicAdresse1<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>dicAdresse2<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     dicJSON.Add \"Vorname\", \"Andre\"\r\n     dicJSON.Add \"Nachname\", \"Minhorst\"\r\n     dicJSON.Add \"Adressen\", colAdressen\r\n     colAdressen.Add dicAdresse1\r\n     dicAdresse1.Add \"Strasse\", \"Borkhofer Str. 17\"\r\n     dicAdresse1.Add \"PLZ\", \"47137\"\r\n     dicAdresse1.Add \"Ort\", \"Duisburg\"\r\n     colAdressen.Add dicAdresse2\r\n     dicAdresse2.Add \"Strasse\", \"Gerichtsstr. 2a\"\r\n     dicAdresse2.Add \"PLZ\", \"12344\"\r\n     dicAdresse2.Add \"Ort\", \"Testhausen\"\r\n     strJSON = ConvertToJson(dicJSON)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strJSON\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000412\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000412?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000412\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9445dca723\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>.NET bietet sehr viele Steuer-elemente. Viel mehr als beispielsweise Microsoft Access. Und auch wenn man unter Access mit den eingebauten Steuerelementen die meisten Aufgaben im Bereich einer Datenbanksoftware erledigen kann, w&uuml;nschen sich viele Entwickler, auch einmal andere Steuer-elemente nutzen zu k&ouml;nnen. Wir untersuchen in diesem Artikel, ob und wie wir .NET-Steuerelemente unter Access einbinden und in Formularen anzeigen k&ouml;nnen.<\/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":[662023,66062023,44000023,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000412","post","type-post","status-publish","format-standard","hentry","category-662023","category-66062023","category-PowerApps","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000412"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000412\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000412"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}