Seite 1 von 1

JSON via ScriptControl und COMate

Verfasst: 17.04.2013 20:57
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

Re: JSON via ScriptControl und COMate

Verfasst: 17.04.2013 21:37
von Josh
ScriptControl -> nix 64 bit

Re: JSON via ScriptControl und COMate

Verfasst: 17.04.2013 21:52
von Nino
Funktioniert prima hier (PB 5.11 unter Windows XP 32 Bit). :allright:

Vielen Dank!

Re: JSON via ScriptControl und COMate

Verfasst: 18.04.2013 09:43
von RSBasic
@Kiffi
Danke. :allright:

Re: JSON via ScriptControl und COMate

Verfasst: 19.04.2013 09:37
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.

Re: JSON via ScriptControl und COMate

Verfasst: 19.04.2013 11:10
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:

Re: JSON via ScriptControl und COMate

Verfasst: 24.10.2014 21:30
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