{"id":55000361,"date":"2023-04-01T00:00:00","date_gmt":"2023-04-25T13:26:17","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=361"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Mit_JSON_arbeiten","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Mit_JSON_arbeiten\/","title":{"rendered":"Mit JSON arbeiten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/fc7b438313b04267bf89a93a54dfc1d7\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Beispiel f&uuml;r eine JSON-Datei<\/span><\/b><\/p>\n<p><b>JSON hei&szlig;t JavaScript Object Notation und ist wie XML ein Format, mit dem Daten strukturiert gespeichert werden k&ouml;nnen. Als Visual Basic-Entwickler hat man &uuml;blicherweise nicht viele Ber&uuml;hrungspunkte mit dieser Notation. Wenn man jedoch gelegentlich mit Webservices beziehungsweise Rest APIs arbeitet, findest der Datenaustausch entweder mit XML oder JSON statt. W&auml;hrend es f&uuml;r den Zugriff auf den Inhalt von XML-Dokumenten die &#8220;Microsoft XML, vX.0&#8221;-Bibliothek gibt, ist man bei JSON auf L&ouml;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&ouml;nnen.<\/b><\/p>\n<p>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 &#8220;k&uuml;nstliche Intelligenz&#8221; zu nutzen, erkl&auml;ren wir im Artikel  <b>OpenAI mit VBA <\/b>(<b>www.vbentwickler.de\/355<\/b>). Das Ergebnis eines solchen Aufrufs sieht wie in Listing 1 aus.<\/p>\n<pre>{\r\n    \"id\":\"cmpl-6kCY6I3xWbEUljecYvr9nKV5GsY3s\",\r\n    \"object\":\"text_completion\",\r\n    \"created\":1676469346,\r\n    \"model\":\"text-davinci-003\",\r\n    \"choices\":[\r\n       {\r\n          \"text\":\"\\n\\nLeider gibt es keine native OpenAI-Integration in Microsoft Office. Wenn Sie OpenAI jedoch in \r\n              Microsoft Office verwenden m&ouml;chten, k&ouml;nnen Sie versuchen, eine L&ouml;sung zu implementieren, die OpenAI-\r\n              APIs verwendet, um die Anwendungen in Ihrer Office-Suite zu erweitern. Solche L&ouml;sungen beinhalten \r\n              normalerweise die Entwicklung eigener Apps und Add-Ins, die OpenAI-APIs verwenden, um bestimmte \r\n              Funktionen in Microsoft Office bereitzustellen.\",\r\n          \"index\":0,\r\n          \"logprobs\":null,\r\n          \"finish_reason\":\"stop\"\r\n       }\r\n    ],\r\n    \"usage\":{\r\n       \"prompt_tokens\":14,\r\n       \"completion_tokens\":146,\r\n       \"total_tokens\":160\r\n    }\r\n}<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Beispiel f&uuml;r eine JSON-Datei<\/span><\/b><\/p>\n<p>Ein solches Ergebnis k&ouml;nnen wir in eine <b>String<\/b>-Variable einf&uuml;gen und dann mithilfe von Zeichenketten-Funktionen die gew&uuml;nschten Informationen herausfiltern. Wenn wir f&uuml;r das JSON-Dokument aus dem Beispiel etwa den Inhalt des Elements <b>text <\/b>erhalten wollen, k&ouml;nnten wir wie folgt vorgehen &#8211; und hier gehen wir davon aus, dass das JSON-Dokument nicht so sch&ouml;n formatiert daherkommt wie im abgebildeten Listing, sondern ohne Zeilenumbr&uuml;che und ohne Einr&uuml;ckungen. Genau genommen w&auml;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 <b>strJSON <\/b>geschrieben. Dann suchen wir mit der <b>InStr<\/b>-Funktion nach dem ersten Auftreten des Elements <b>text<\/b> mit den umschlie&szlig;enden Anf&uuml;hrungszeichen und dem folgenden Doppelpunkt &#8211; gefolgt sicherheitshalber noch vom Anf&uuml;hrungszeichen des gesuchten Wertes: <b>&#8220;&#8221;text&#8221;&#8221;:&#8221;&#8221;<\/b><\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>JSONPerZeichenkette()\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngStart<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngEnde<span style=\"color:blue;\"> As Long<\/span>\r\n     strJSON = strJSON & \"{\"\"id\"\":\"\"cmpl-6kCY6I3xWbEUljecYvr9nKV5GsY3s\"\",\"\"object\"\":\"\"text_completion\"\",\" _\r\n         & \"\"\"created\"\":1676469346,\"\"model\"\":\"\"text-davinci-003\"\",\"\"choices\"\":[{\"\"text\"\":\"\"\\n\\nLeider gibt es \" _\r\n         & \"keine native OpenAI-Integration in Microsoft Office. ...\"\",\"\"index\"\":0,\"\"logprobs\"\":null,\" _\r\n         & \"\"\"finish_reason\"\":\"\"stop\"\"}],\"\"usage\"\":{\"\"prompt_tokens\"\":14,\"\"completion_tokens\"\":146,\" _\r\n         & \"\"\"total_tokens\"\":160}}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     lngStart = <span style=\"color:blue;\">InStr<\/span>(1, strJSON, \"\"\"text\"\":\"\"\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngStart = 0<span style=\"color:blue;\"> Then<\/span>\r\n         lngStart = lngStart + <span style=\"color:blue;\">Len<\/span>(\"\"\"text\"\":\"\"\")\r\n         lngEnde = <span style=\"color:blue;\">InStr<\/span>(lngStart, strJSON, \"\"\",\")\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngEnde = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strText = <span style=\"color:blue;\">Mid<\/span>(strJSON, lngStart, lngEnde - lngStart)\r\n             <span style=\"color:blue;\">Debug.Print<\/span> strText\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Parsen auf herk&ouml;mmliche Art mit Zeichenkettenfunktionen<\/span><\/b><\/p>\n<p>Diese Position merken wir uns mit der Variablen <b>lngStart<\/b>. Ist diese gleich <b>0<\/b>, wurde der Text nicht gefunden &#8211; an dieser Stelle geschieht nichts weiter und die Prozedur wird beendet. Wurde allerdings eine Position gefunden, in diesem Beispiel <b>131<\/b>, ist die Bedingung der <b>If&#8230;Then<\/b>-Bedingung erf&uuml;llt. Da wir aber eigentlich die Startposition des Inhalts von <b>text <\/b>haben wollen, z&auml;hlen wir noch die L&auml;nge der Zeichenkette, die dem gesuchten Text vorausgeht, hinzu. Nun ben&ouml;tigen wir noch die Endposition des einzulesenden Textes. Dazu gehen wir davon aus, dass dieser durch ein Anf&uuml;hrungszeichen mit einem folgenden Komma abgeschlossen wird. Die Position dieser Fundstelle ermitteln wir wieder mit <b>InStr<\/b>, diesmal allerdings mit der Position aus <b>lngStart <\/b>als Startposition. Finden wir auch hier einen Wert, k&ouml;nnen wir anschlie&szlig;end mit der <b>Mid<\/b>-Funktion den gesuchten Text extrahieren und beispielsweise im Direktbereich ausgeben.<\/p>\n<h2>Vor- und Nachteile dieser Vorgehensweise<\/h2>\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\/55000361\/\">\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\/55000361?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\/55000361\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"f686d3144b\"\/>\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>JSON hei&szlig;t JavaScript Object Notation und ist ein Format &auml;hnlich wie XML, mit dem Daten strukturiert gespeichert werden k&ouml;nnen. Als Visual Basic-Entwickler hat man &uuml;blicherweise nicht viele Ber&uuml;hrungspunkte mit dieser Notation. Wenn man jedoch gelegentlich mit Webservices beziehungsweise Rest APIs arbeitet, findest der Datenaustausch entweder mit XML oder JSON statt. W&auml;hrend es f&uuml;r den Zugriff auf den Inhalt von XML-Dokumenten die Microsoft XML, vX.0-Bibliothek gibt, ist man bei JSON auf L&ouml;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&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":[66022023,662023,44000027,44000033],"tags":[],"yst_prominent_words":[],"class_list":["post-55000361","post","type-post","status-publish","format-standard","hentry","category-66022023","category-662023","category-Excel_programmieren","category-Visual_Basic_Programmierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000361","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=55000361"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000361\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000361"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}