JSON Encoder und Decoder

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.
michi1234
Beiträge: 2
Registriert: 21.04.2013 18:30

Re: JSON Encoder und Decoder

Beitrag von michi1234 »

Hallo,
ich finde die Idee mit dem Json De-/-Encoder unter Purebasic recht gut, habe allerdings hierbei mit dem Kontakt zu einem DB-Server Probleme :

Wenn ich folgende Struktur definiere :

Code: Alles auswählen

Define myJSON.jsonObj
  myJson\o("command")\s = "CONNECT"
  myJson\o("username")\s = sha1Username
  myJson\o("password")\s = sha1Password
  myJson\o("randpool")\i = randpool
  
  JSON_Debug(@myJSON, "")
  strResult.s = JSON_encode(@myJSON)
  Debug "Testjson " + strResult
  ; creates a new file in tempdir and opens it with standard-program for *.txt files!
  Define file.s =  GetTemporaryDirectory() + "json.txt"
  If CreateFile(0, file)
    WriteString(0, strResult)
    CloseFile(0)
    RunProgram(file)
  EndIf
bekomme ich folgende Ausgabe als Debug bzw. Stringausgabe in der Datei :

Code: Alles auswählen

(object) : {
randpool(int) : 1234
password (string) : 18546076cbd1196640cfd2ca899bc5b8cfe04bb6
username (string) : e0489cd5c151d95f52ce708a6158bb8c3d05b6fc
command (string) : CONNECT
}
bzw.

Code: Alles auswählen

{
  "randpool" : 1234,
  "password" : "18546076cbd1196640cfd2ca899bc5b8cfe04bb6",
  "username" : "e0489cd5c151d95f52ce708a6158bb8c3d05b6fc",
  "command" : "CONNECT"
}
Das ist nach meiner Auffassung nicht korrekt , da hier einmal die Reihenfolge der Definition verändert wird und die Ausgabe enthält zusätzlich Zeichen wie <CR><LF> usw., die in der Definition nicht enthalten waren.
Die Ausgabe müsste so aussehen :

Code: Alles auswählen

{ "command" : "CONNECT", "username" : "e0489cd5c151d95f52ce708a6158bb8c3d05b6fc", "password" : "18546076cbd1196640cfd2ca899bc5b8cfe04bb6", "randpool" : 1234 }
Gruß

Michael

__________________________________________________
Code-Tags hinzugefügt
21.04.2013
RSBasic
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON Encoder und Decoder

Beitrag von Kiffi »

ich bin jetzt nicht der JSON-Spezialist, aber meines
Erachtens ist die Reihenfolge von Objekten irrelevant,
solange die Struktur der Daten nicht verändert wird.

Denn auf der 'Gegenseite' werden die Objekte wieder
nach Namen aufgelöst (zumindest 'sollten aufgelöst
werden
'), und da ist es unerheblich, ob 'command' nun
am Anfang oder am Ende eines JSON steht.

Die Zeilenumbrüche dienen (analog zu XML) nur der
besseren Lesbarbeit und werden ignoriert, solange sie
nicht innerhalb der Objektwerte befinden.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: JSON Encoder und Decoder

Beitrag von PMV »

Die Reihenfolge von Map-Elementen ist nicht definiert. Es ist somit
unmöglich die Reihenfolge vorher zu sagen. Da auf diese allerdings
mit einem Schlüsselwort zugegriffen wird, ist diese auch unerheblich.
Das selbe dürfte auch für JSON-Objekte gelten. :wink:

JSON erlaubt Whitespaces:
http://tools.ietf.org/html/rfc4627 hat geschrieben: Insignificant whitespace is allowed before or after any of the six
structural characters.

Insignificant whitespace is allowed before or after any of the six
structural characters.

ws = *(
%x20 / ; Space
%x09 / ; Horizontal tab
%x0A / ; Line feed or New line
%x0D ; Carriage return
)
Somit sollten die Zeilenumbrüche und Leerzeichen
das nicht das Problem sein. :)
Eine Funktion ohne Formatierungszeichen werd ich
aber bestimmt auch noch machen, allerdings wird
das wohl nur für wirklich sehr große Mengen
relevant sein.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
michi1234
Beiträge: 2
Registriert: 21.04.2013 18:30

Re: JSON Encoder und Decoder

Beitrag von michi1234 »

Hallo,
danke für die schnelle Antwort.
Ja , Sie haben beide Recht, die Reihenfolge in einer Map ist nicht vorhersehbar.
Die Praxis zeigt jedoch kommerzielle Server Implementierungen, die sich nicht immer am Standart definieren
und hier gibt es z.B. eine JSON Java-Implementierung z.B. Gson , die die Reihenfolge der Definition auch im String beibehält ( ob gewollt , kann ich nicht sagen).
Nun lässt sich das Problem natürlich mit einem Workaround beheben, in dem der String selbst zusammengesetzt wird.

Gruß
Michael
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: JSON Encoder und Decoder

Beitrag von PMV »

Also eine Objektliste mit definierter Reihenfolge ließe sich
als Linked List implementieren. Dieser Objekttyp in die
Encoding-Funktion einbauen und schon wäre dein
Feature fertig. Ich werds mal im Hinterkopf behalten,
allerdings darfst du das auch gerne selbst umsetzen
und hier wieder zur Verfügung stellen. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: JSON Encoder und Decoder

Beitrag von PMV »

update 01.08.2013
+ bufix: Stringerstellung für Unicode escaped Zeichen (Tab, Zeilenumbruch, Slash, ...) schlug fehl
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten