PHP JSON != SpiderBasic JSON?

Hier könnt ihr alle Fragen zu SpiderBasic austauschen.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

PHP JSON != SpiderBasic JSON?

Beitrag von Kurzer »

Moin zusammen,

nun ist es soweit, ich bin stolzer Besitzer von SpiderBasic und frickel an meinem ersten Projekt herum.

Bei der Kommunikation mit einem PHP Modul stoße ich auf ein Problem bzgl. des JSON Formats.
Ich kodiere in einem PHP Modul Userdaten zu einem JSON-String. Diesen JSON String soll SpiderBasic in eine Liste extrahieren.

Offenbar weichen die Formatierungen hier aber ab, wenn ich mir den JSON-String aus der Spider-Hilfe ansehe:

Code: Alles auswählen

"[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " + 
             "{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]
und den JSON String, den mir PHP codiert:

Code: Alles auswählen

[{"users_id":"1011","accesslevel":"0","firstname":"Hans","lastname":"Wurst","email":"grillwurst@meika.de"},{"users_id":"1012","accesslevel":"1","firstname":"Hans2","lastname":"Wurst2","email":"grillwurst2@meika.de"}]
Jedenfalls bekomme ich den String mit folgendem Programmschnipsel nicht dekodiert.
Ihr müsst dazu den JSON String in eine lokale Textdatei kopieren. Das Testprogramm lädt diese dann per FileRequester() ein.

Code: Alles auswählen

Structure User
	Userid.s
	Accesslevel.s
	Firstname.s
	Lastname.s
	Email.s
EndStructure

Global Input.s

Procedure ReadCallback(Status, Filename$, File, Size)
	If Status = #PB_Status_Loaded
		Debug "File: " + Filename$ + " - Size: " + Size + " bytes"
		
		Input = ReadString(0, #PB_File_IgnoreEOL)            
		CloseFile(0)
		
	ElseIf Status = #PB_Status_Error
		Debug "Error when loading the file: " + Filename$
	EndIf
EndProcedure

Procedure OpenFileRequesterCallback()
	If NextSelectedFile()
		ReadFile(0, SelectedFileID(), @ReadCallback(), #PB_LocalFile)
	EndIf
EndProcedure

Procedure ChooseFileEvent()
	OpenFileRequester("*.txt", @OpenFileRequesterCallback())
EndProcedure

Procedure ExtractJSON()
	Debug Input
	NewList Users.User()
	
	ParseJSON(0, Input)
	ExtractJSONList(JSONValue(0), Users())
	
	ForEach Users()
		Debug Users()\Userid + ", " + Users()\Accesslevel + ", " + Users()\Firstname + ", " + Users()\Lastname + ", " + Users()\Email
	Next
EndProcedure

OpenWindow(0, 0, 0, 300, 100, "Read file example", #PB_Window_ScreenCentered)
ButtonGadget(0, 10, 10, 280, 30, "Choose a file...")
ButtonGadget(1, 10, 60, 280, 30, "Extract JSON")
BindGadgetEvent(0, @ChooseFileEvent())
BindGadgetEvent(1, @ExtractJSON())
Kann man da irgendwas machen ohne den ganzen JSON String auf das "SpiderBasic-Format" umformatieren zu müssen?

Gruß
Kurzer
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: PHP JSON != SpiderBasic JSON?

Beitrag von Kurzer »

Krass! Ich habe die Ursache gefunden.

Die Strukturfelder der Liste müssen zwingend genau so heißen wie die Elemente in dem JSON String. Inkl. Groß-/Kleinschreibung.

Code: Alles auswählen

[{"users_id":"1011","accesslevel":"0","firstname":"Hans","lastname":"Wurst","email":"grillwurst@meika.de"},{"users_id":"1012","accesslevel":"1","firstname":"Hans2","lastname":"Wurst2","email":"grillwurst2@meika.de"}]

Code: Alles auswählen

Structure User
	users_id.s
	accesslevel.s
	firstname.s
	lastname.s
	email.s
EndStructure

[...]

	ForEach Users()
		Debug Users()\users_id + ", " + Users()\accesslevel + ", " + Users()\firstname + ", " + Users()\lastname + ", " + Users()\email
	Next
Das habe ich so nicht erwartet und sollte in der Hilfe evtl. ein bisschen eindeutiger formuliert werden.
Dort steht nur, dass der Typ der JSON Elemente und der Liste übereinstimmen müssen.
SpiderBasic Hilfe hat geschrieben:If the JSON value contains any elements that do not have the proper type to match the List(), they will be ignored and the corresponsing list element will be left empty.
Kurzer
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: PHP JSON != SpiderBasic JSON?

Beitrag von NicTheQuick »

Ich habe keine Spiderbasic, aber JSON ist JSON. Da kann es höchstes falsche Implementierungen geben.
Ein Wert kann demnach null, eine Ganzzahl, Fließkommazahl, ein boolscher Wert (true, false) oder ein String sein.

Der unmöglich kompliziert geschrieben JSON-String aus der Spiderbasic-Hilfe scheint Ganzzahlen zu beinhalten, während PHP ausnahmslos Strings nutzt. Vielleicht liegt das Problem eher daran?
Hier noch der Vollständigkeit halber die besser formatierte Version des Beispiels aus der Hilfe:

Code: Alles auswählen

Debug ~"[ {\"x\": 10, \"y\": 20}, {\"x\": 30, \"y\": 50}, {\"x\": -5, \"y\": 100} ]"
Wo siehst du eigentlich genau den Unterschied zwischen PHP- und Spiderbasic-JSON?

Edit:
Ups, da war ich etwas spät. Aber die Lösung ergibt Sinn. Danach hab ich gar nicht geschaut. Ich meine in Javascript ist Groß- und Kleinschreibung ja auch wichtig.
Bild
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: PHP JSON != SpiderBasic JSON?

Beitrag von Kurzer »

Moin Nic,

um noch kurz Deine Frage zu beantworten.
Ja, als vermeintliche Unterschiede sah ich z.B., dass PHP alle Werte in Hochkommas einschließt. Das SB Beispiel jedoch nicht.

Code: Alles auswählen

 SB: Chr(34) + ": 10, " + Chr(34)
PHP: users_id":"1011",
Aber wie du schon richtig erklärt hast, sieht PHP alle values als String an und verpackt sie dann auch entsprechend als String im JSON String.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: PHP JSON != SpiderBasic JSON?

Beitrag von NicTheQuick »

Also PHP macht nicht aus allem einen String. Das wäre auch falsch. Dieser Beispielcode von hier interpretiert Zahlen korrekt:

Code: Alles auswählen

$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

echo json_encode($arr);
Das Ergebnis davon ist:

Code: Alles auswählen

{"a":1,"b":2,"c":3,"d":4,"e":5}
Bild
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: PHP JSON != SpiderBasic JSON?

Beitrag von Kurzer »

Hmm, interessant.

Mir wäre es eigentlich auch lieber, wenn PHP aus den Datensätzen in der Datenbanktabelle einen numerischen Wert macht, wenn die betreffende Spalte ein INT Datentyp ist.
In meinem Fall sind die beiden Spalten users_id und accesslevel INT Datentypen.

Code: Alles auswählen

      $statement = $this->connection->prepare('
        SELECT users_id, accesslevel, firstname, lastname, email
        FROM users 
        ' . $where);

      $statement->execute();

      $result = $statement->fetchAll(PDO::FETCH_ASSOC);
Der Code da oben gibt mir ein Array zurück, welches ich dann einfach per json_encode() in JSON kodieren lasse.
Leider alle Werte dann als String. :|

Code: Alles auswählen

$users = new Users();
  $allusers = $users->getAllUsers(false);
  if ($allusers != false) {
    echo json_encode($allusers);
[...]
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: PHP JSON != SpiderBasic JSON?

Beitrag von NicTheQuick »

Hier ist prinzipiell die Lösung für das Problem mit den Integers, die zu Strings werden: https://stackoverflow.com/a/16129496
Es hat damit zu tun, dass z.B. MySQL größere Zahlen speichern kann als PHP. Leider funktioniert genau dieser Parameter mit MySQL nicht. Jetzt, wo ich das sehe, finde ich das höchste bescheuert. In meinem letzten PHP-Projekt nutze ich aber auch kein PDO, sondern mysqli. Ich habe lange geforscht, was von beidem besser ist, und es hat sich wohl herausgestellt, dass mysqli vorzuziehen ist. Die Gründe weiß ich aber nicht mehr. :lol:
Also falls du das umbauen willst, hier siehst du wie ich es gemacht habe: https://github.com/NicolasGoeddel/weath ... tabase.php
Bild
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: PHP JSON != SpiderBasic JSON?

Beitrag von Kurzer »

NicTheQuick hat geschrieben:Hier ist prinzipiell die Lösung für das Problem mit den Integers, die zu Strings werden: https://stackoverflow.com/a/16129496
Danke für den Tipp!
Bei UserIDs und Zugriffsleveln wird der Wertebereich nicht höher werden, als es PHP handlen kann.
PHP Hilfe hat geschrieben:JSON_NUMERIC_CHECK (integer) Kodiert numerische Zeichenketten als Zahlen. Verfügbar von PHP 5.3.3 an.
Hmm, welche Version hat der Kundenserver?
PHP-Version: 5.6.22-2

Hervorragend! :allright:

PS: Schade, dass du die Gründe nicht mehr weißt warum mysqli dem PDO vorzuziehen ist.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: PHP JSON != SpiderBasic JSON?

Beitrag von NicTheQuick »

Kurzer hat geschrieben:Hmm, welche Version hat der Kundenserver?
PHP-Version: 5.6.22-2
Wie bitte? 5.6.x gehört schon lange auf den Müll. Das ist schon 2019 ausgestorben. Heutzutage sollte man mindestens mit PHP 7.1.31+ arbeiten, oder besser gleich mit PHP 7.4.x. Wo wird denn noch PHP 5.6 angeboten?
Bild
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: PHP JSON != SpiderBasic JSON?

Beitrag von Kurzer »

Bei timmehosting.de

Aber es hat eher mit dem Webshop zu tun, der da auch noch läuft. Ich glaube der setzt eine bestimmte Range der PHP Version voraus (Vermutung).

Timme bietet aber auch aktuelle PHP Versionen an:
Timme Webseite hat geschrieben:7.0 bis 7.4, 5.3 bis 5.6
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Antworten