JSON via ScriptControl und COMate

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

JSON via ScriptControl und COMate

Beitrag von Kiffi »

Ahoi,

nachfolgend möchte ich Euch eine (meines Erachtens) einfache
Möglichkeit vorstellen, mit Hilfe des ScriptControls und COMate
JSON-Daten zu verarbeiten.

Zuerst erstellen wir ein Objekt von Typ ScriptControl...

Code: Alles auswählen

ScriptControl = COMate_CreateObject("ScriptControl")
... und stellen die Sprache auf JScript (die Microsoft-Variante von JavaScript):

Code: Alles auswählen

ScriptControl\SetProperty("Language = 'JScript'")
Hier mal ein simples JSON-Beispiel:

Code: Alles auswählen

var Person = {
  "Vorname" : "Peter",
  "Nachname" : "Parker",
  "Hobbys" : [ "Klettern", "Verkleiden", "Spinnen" ]
};
In PB-Schreibweise sieht das dann (leider) so aus:

Code: Alles auswählen

JSON = "var Person = {" +
       Chr(34) + "Vorname"  + Chr(34) + " : " + Chr(34) + "Peter" + Chr(34) + ", " +
       Chr(34) + "Nachname" + Chr(34) + " : " + Chr(34) + "Parker" + Chr(34) + ", " +
       Chr(34) + "Hobbys"  + Chr(34) + " : [" + Chr(34) + "Klettern" + Chr(34) + ", " + Chr(34) + "Verkleiden" + Chr(34) + ", " + Chr(34) + "Spinnen" + Chr(34) + " ]" +
       "};"
Bitte darauf achten, dass evtl. vorkommende einfache Hochkommata durch $0027 ersetzt werden:

Code: Alles auswählen

JSON = ReplaceString(JSON, "'", "$0027")
nun können wir mittels AddCode unser JSON dem ScriptControl hinzufügen...

Code: Alles auswählen

ScriptControl\Invoke("AddCode('" + JSON + "')")
... und auch sogleich ohne Mühe auf die einzelnen Objekte zugreifen:

Code: Alles auswählen

Debug "Vorname: "  + ScriptControl\GetStringProperty("Eval('Person.Vorname')")
Debug "Nachname: " + ScriptControl\GetStringProperty("Eval('Person.Nachname')")

AnzahlHobbys = ScriptControl\GetIntegerProperty("Eval('Person.Hobbys.length')")

Debug "Hobbys:"
For HobbyCounter = 0 To AnzahlHobbys - 1
  Debug ScriptControl\GetStringProperty("Eval('Person.Hobbys[" + Str(HobbyCounter) + "]')")
Next
und hier nochmal der gesamte Code:

Code: Alles auswählen

IncludeFile "[DeinPfadZu]\COMatePLUS.pbi" ; Anpassen

EnableExplicit

Define ScriptControl.COMateObject
Define JSON.s
Define AnzahlHobbys, HobbyCounter

ScriptControl = COMate_CreateObject("ScriptControl")

If ScriptControl
	
	ScriptControl\SetProperty("Language = 'JScript'")
	
	JSON = "var Person = {" +
	       Chr(34) + "Vorname"  + Chr(34) + " : " + Chr(34) + "Peter" + Chr(34) + ", " +
	       Chr(34) + "Nachname" + Chr(34) + " : " + Chr(34) + "Parker" + Chr(34) + ", " +
	       Chr(34) + "Hobbys"  + Chr(34) + " : [" +
	       Chr(34) + "Klettern" + Chr(34) + ", " + Chr(34) + "Verkleiden" + Chr(34) + ", " + Chr(34) + "Spinnen" + Chr(34) +
	       " ]" +
	       "};"
	
	JSON = ReplaceString(JSON, "'", "$0027")
	
	ScriptControl\Invoke("AddCode('" + JSON + "')")
	
	Debug "Vorname: "  + ScriptControl\GetStringProperty("Eval('Person.Vorname')")
	Debug "Nachname: " + ScriptControl\GetStringProperty("Eval('Person.Nachname')")
	
	AnzahlHobbys = ScriptControl\GetIntegerProperty("Eval('Person.Hobbys.length')")
	
	Debug "Hobbys:"
	For HobbyCounter = 0 To AnzahlHobbys - 1
		Debug ScriptControl\GetStringProperty("Eval('Person.Hobbys[" + Str(HobbyCounter) + "]')")
	Next
	
	ScriptControl\Release()
	
Else
	
	Debug "!ScriptControl"

EndIf
Viel Spaß beim Ausprobieren.

Grüße ... Kiffi
Hygge
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: JSON via ScriptControl und COMate

Beitrag von Josh »

ScriptControl -> nix 64 bit
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: JSON via ScriptControl und COMate

Beitrag von Nino »

Funktioniert prima hier (PB 5.11 unter Windows XP 32 Bit). :allright:

Vielen Dank!
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: JSON via ScriptControl und COMate

Beitrag von RSBasic »

@Kiffi
Danke. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: JSON via ScriptControl und COMate

Beitrag von Nino »

Josh hat geschrieben:ScriptControl -> nix 64 bit
Fehlerbericht nix besonders detaillierte Aussage. :mrgreen:

Ich habe den Code jetzt gerade unter Windows 7 Professional SP1 x64 getestet.
Mit PB 5.11 x86 funktioniert er auch hier unter x64 wie erwartet (Unicode- und ASCII-Modus).

Mit PB 5.11 x64 erhalte ich im Unicode-Modus:
Debugger hat geschrieben:!ScriptControl
Mit PB 5.11 x64 im ASCII-Modus hängt sich das Programm auf, nach kurzer Zeit kommt die Meldung:
Windows hat geschrieben:PureBasic_Compilation0.exe funktioniert nicht mehr
[...]
Das Problem wird also nicht durch das 64-Bit-Betriebssystem an sich verursacht, sondern durch ein 64-Bit-Programm (s.a. http://social.msdn.microsoft.com/Forums ... f7d4647d8/). Ich denke der Code sollte daher besser in

Code: Alles auswählen

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86

CompilerEndIf
eingeschlossen werden.

Wenn man diese Funktionalität in einem 64-Bit-Programm nutzen möchte, so kann man das erreichen in dem man ein 32-Bit-Hilfsprogramm schreibt welches die Aufgabe erledigt und seine Ergebnisse z.B. in eine Datei schreibt, die dann vom Hauptprogramm gelesen wird.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: JSON via ScriptControl und COMate

Beitrag von Josh »

Nino hat geschrieben:
Josh hat geschrieben:ScriptControl -> nix 64 bit
Fehlerbericht nix besonders detaillierte Aussage. :mrgreen:
Da ich nicht mal weiß was JSON genau ist und was ich damit machen soll habe ich es auch nicht getestet. Es war also kein Fehlerbericht sondern nur eine Feststellung für:

weiche mirco schon viel lang nix mehr machen für diese dumb host, so nix geben scriptcontrol für laufen in 64bit programm :mrgreen:
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON via ScriptControl und COMate

Beitrag von Kiffi »

buddel, buddel, ...

das Thema JSON hat sich mit der PB-Version 5.30 glücklicherweise erledigt,
aber bzgl. der NichtLaufFähigKeit des ScriptControls unter 64bit habe ich hier
was Interessantes gefunden.

Script Control for 64-bit platforms:
http://www.eonet.ne.jp/~gakana/tablacus ... ol_en.html

Scheint zu funktionieren...

Grüße ... Peter
Hygge
Antworten