PureBoard
http://forums.purebasic.com/german/

PHP JSON != SpiderBasic JSON?
http://forums.purebasic.com/german/viewtopic.php?f=33&t=32059
Seite 1 von 2

Autor:  Kurzer [ 31.07.2020 21:06 ]
Betreff des Beitrags:  PHP JSON != SpiderBasic JSON?

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:
"[ {" + 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:
[{"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:
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

Autor:  Kurzer [ 31.07.2020 23:00 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

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:
[{"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:
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

Autor:  NicTheQuick [ 31.07.2020 23:01 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

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:
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.

Autor:  Kurzer [ 31.07.2020 23:33 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

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:
 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.

Autor:  NicTheQuick [ 31.07.2020 23:45 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

Also PHP macht nicht aus allem einen String. Das wäre auch falsch. Dieser Beispielcode von hier interpretiert Zahlen korrekt:
Code:
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

echo json_encode($arr);

Das Ergebnis davon ist:
Code:
{"a":1,"b":2,"c":3,"d":4,"e":5}

Autor:  Kurzer [ 01.08.2020 17:34 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

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:
      $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:
$users = new Users();
  $allusers = $users->getAllUsers(false);
  if ($allusers != false) {
    echo json_encode($allusers);
[...]

Autor:  NicTheQuick [ 01.08.2020 22:30 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

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

Autor:  Kurzer [ 01.08.2020 22:43 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

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.

Autor:  NicTheQuick [ 01.08.2020 23:00 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

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?

Autor:  Kurzer [ 02.08.2020 11:15 ]
Betreff des Beitrags:  Re: PHP JSON != SpiderBasic JSON?

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

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/