ComObject vs ArrayObject

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

BoBo
Posts: 4343
Joined: 13 May 2014, 17:15

ComObject vs ArrayObject

Post by BoBo » 19 Dec 2020, 09:30

Basierend auf folgender Anfrage: https://www.autohotkey.com/boards/viewtopic.php?f=76&t=75826 , welche mittel ComObj eine Abfrage anstösst, wobei WinHttp.ResponseText wie folgt retourniert:

{"abbreviation":"CET","client_ip":"37.201.192.241","datetime":"2020-12-19T10:36:07.373785+01:00","day_of_week":6,"day_of_year":354,"dst":false,"dst_from":null,"dst_offset":0,"dst_until":null,"raw_offset":3600,"timezone":"Europe/Berlin","unixtime":1608370567,"utc_datetime":"2020-12-19T09:36:07.373785+00:00","utc_offset":"+01:00","week_number":51}

... stellt sich mir, dem bekennenden RegEx-Legastheniker, die Frage wieso das ComObj-item mit vermeintlich! identischer Syntax wie ein assoziatives ArrayObject nicht direkt auswertbar zu sein scheint?? Irgendwie hatte ich laienhaftigst angenommen da geht sowas wie WinHttp.ResponseText.datetime :angel: bzw es ließe sich etwa so übergeben:

arr := WinHttp.ResponseText ; dies ist ein ass. array. Aber Nein, nada, niente, meh ... :think:

Also frunzt das Bo mal wieder etwas drumherum, oder, wie mein LieblingsChinese sagen würde ...
Show me yul Wok-alound!
:mrgreen:


Any thoughts?
Gruß BoBo
gregster
Posts: 5791
Joined: 30 Sep 2013, 06:48

Re: ComObject vs ArrayObject

Post by gregster » 19 Dec 2020, 09:44

Das ist kein assoz. Objekt, sondern lediglich eine Zeichenkette - im JSON-Format. Üblicherweise liest man das mit einer der verfügbaren JSON-Bibs/Funktionen (Coco, teadrinker etc.) in ein Objekt und kann es dann als solches auslesen oder bearbeiten (und ggf wieder in einen String umwandeln, wenn gewünscht - z. B. zum Abspeichern in einer Textdatei).
BoBo
Posts: 4343
Joined: 13 May 2014, 17:15

Re: ComObject vs ArrayObject

Post by BoBo » 19 Dec 2020, 10:22

Hallo gregster. Yep, entsprechend habe ich es im workaround auch verwurstet. Doch die string-syntax
arr := WinHttp.ResponseText ; object item AKA string welcher da ist: {"abbreviation":"CET","client_ip":"37.201.192.241", ...} failed (vermute die {curlies} werden als str statt als operatoren (?) interpretiert, doch barum?), während ...
arr := {"abbreviation":"CET","client_ip":"37.201.192.241", ...} ; als object (mit selber Schreibweise!) initialisiert wie gehabt succeeded.

Deinen Worten entnehme ich, das es keinen "raketentechn-/syntaktischeren" workaround gibt??
gregster
Posts: 5791
Joined: 30 Sep 2013, 06:48

Re: ComObject vs ArrayObject

Post by gregster » 19 Dec 2020, 10:28

Wie gesagt, man muss den übers Internet erhaltenen String in ein Objekt einlesen. Dafür gibt es bereits existierende Funktionen/Methoden in den einschlägigen Bibliotheken: z. B. JSON.Load() in Coco's JSON-Bibliothek. Analog gibt's es auch ähnliche Funktionen von teadrinker, TheArkive u. a. Dafür sind diese Bibliotheken ja extra erstellt worden (und auch für vice versa Objekt zu String)

Wenn du das Rad stattdessen neu erfinden willst, und eigene Parsing-Funktionen oder RegEchsen schreiben willst, steht dir diese Option natürlich auch offen.
BoBo
Posts: 4343
Joined: 13 May 2014, 17:15

Re: ComObject vs ArrayObject

Post by BoBo » 19 Dec 2020, 10:32

Da der str nur eine Zeile umfasste, habe ich vom including der JSON-library abgesehen - deren Handhabung ist ja auch nicht zwingend jedem/r ad-hoc nachvollziehbar.
gregster
Posts: 5791
Joined: 30 Sep 2013, 06:48

Re: ComObject vs ArrayObject

Post by gregster » 19 Dec 2020, 10:39

Ich weiß nicht, was das mit "nur einer Zeile" zu tun hat... eben so wird das gesamte Objekt als Zeichenkette übers Internet übertragen.
Wenn du nur wenige, einfache Elemente aus diesem JSON-String brauchst, dann können diverse String-Funktionen/RegEchsen es garantiert verkürzen, aber wenn du es tatsächlich als Objekt haben willst (und auf versch. Werte zugreifen willst), dann wirst du schon mal eine etwas komplexere Parsing-Funktion brauchen, um das Objekt zu erzeugen (da gibt es versch. Ansätze, teadrinker macht sich bspw Javascript zunutze, während Coco sich auf AHK-Bordmittel verlässt, iirc).

Diese Funktionen sind vor allem hilfreich, wenn du geschachtelte Objekte hast, anstatt nur einfacher Key:Value-Paare - das hast du im Fall oben nicht, soweit ich sehe. Aber nicht jeder Fall ist so einfach gelagert. Du wirst also nicht jeden ResponseText/JSON-String mit deiner Methode oben korrekt in ein Objekt überführen können.
just me
Posts: 7725
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ComObject vs ArrayObject

Post by just me » 19 Dec 2020, 10:40

BoBo wrote:... failed (vermute die {curlies} werden als str statt als operatoren (?) interpretiert, doch warum?), ...
Weil sie innerhalb eines Strings stehen.

Code: Select all

arr := WinHttp.ResponseText ; object item AKA string welcher da ist: {"abbreviation":"CET","client_ip":"37.201.192.241", ...}
; ist equivalent zu
arr := "{""abbreviation"":""CET"",""client_ip"":""37.201.192.241"", ...}"
BoBo
Posts: 4343
Joined: 13 May 2014, 17:15

Re: ComObject vs ArrayObject

Post by BoBo » 19 Dec 2020, 11:04

Weil sie innerhalb eines Strings stehen.
Merci. Umgehung der Hürde hatte ich jedoch auch schon probiert. Und zwar so ...

Code: Select all

str := Trim(WinHttp.ResponseText,"{}") ; eliminiert die {curlies}
arr := {str} ; dafür erwartet der Interpreter jetzt nen "fehlenden Schlüssel".
;)
gregster
Posts: 5791
Joined: 30 Sep 2013, 06:48

Re: ComObject vs ArrayObject

Post by gregster » 19 Dec 2020, 11:11

just me's Beitrag ist ja auch nicht als Lösung gedacht, sondern als (weiterer Versuch einer) Erklärung, afaics. :)
--> Eine Zeichenkette ist kein Objekt. Zur Überführung (auch vice versa) muss irgendeine Art von Parsing passieren.
(Was bei verschachtelten Datenstrukturen komplizierter würde als im Fall oben)
BoBo
Posts: 4343
Joined: 13 May 2014, 17:15

Re: ComObject vs ArrayObject

Post by BoBo » 19 Dec 2020, 11:15

Diese Funktionen sind vor allem hilfreich, wenn du geschachtelte Objekte hast, anstatt nur einfacher Key:Value-Paare - das hast du im Fall oben nicht, soweit ich sehe. Aber nicht jeder Fall ist so einfach gelagert. Du wirst also nicht jeden ResponseText/JSON-String mit deiner Methode oben korrekt in ein Objekt überführen können.
D'accord. Habe mich von CoCo's auch bereits bespassen lassen. Doch wie bereits gesagt, mit "Hundertzeilern auf Einzeiler schießen" schien mir etwas überdimensioniert, zumal mir anschließender Support auf Nachfrage dazu wahrscheinlich schwer fallen würde. :shh:
just me's Beitrag ist ja auch nicht als Lösung gedacht, sondern als (weiterer Versuch einer) Erklärung, afaics.
Hab ich auch so verstanden. Und mein Versuch war als weiterer (vorheriger) Versuch gedacht die üblicherweise nicht vorhandene Hintertür zu finden.

BoBo: :lol:
gregster/just-me: :lolno:
gregster
Posts: 5791
Joined: 30 Sep 2013, 06:48

Re: ComObject vs ArrayObject

Post by gregster » 19 Dec 2020, 11:17

Teadrinkers javascript-basierte Funktion ist wesentlich kürzer. JsonToAHK() oder so...
BoBo
Posts: 4343
Joined: 13 May 2014, 17:15

Re: ComObject vs ArrayObject

Post by BoBo » 19 Dec 2020, 11:27

Von teatrinker habe ich bereits einen JSON-beautifier am Start: https://discord.com/channels/537764560791273472/766604002615230474/766653438863736842
Post Reply

Return to “Ich brauche Hilfe”