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.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: JSON Encoder und Decoder

Beitrag von PMV »

Nero hat geschrieben:Ne ich nutze das immer als normalen JS code also für sowas

Code: Alles auswählen

var myObj = { test: function() { ..... }};
hab es bisher nie für reine Daten gebraucht (bis jetzt :lol: )
Dann hast du noch nie JSON gebraucht. Das sind wirklich nur die Daten
innerhalb eines JS-Objektes in einer bestimmten Notation. Nützlich
um Daten zu verschicken oder zu speichern, ohne den Overhead
bei XML oder den Zeitaufwand für ein eigenes Format.

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 »

+ bugfix: Wenn JSON_decode() auf eine Zahl stieß, auf die eine }-Klammer folgte, wurde die Zahl nicht erkannt und #False zurück gegeben
+ verbessert: ein paar lokale variablen waren nicht deklariert
Da hab ich doch tatsächlich einen Fehler gefunden. /:->
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: JSON Encoder und Decoder

Beitrag von Nero »

Dann hast du noch nie JSON gebraucht
Stimmt wohl :lol:
Da hab ich doch tatsächlich einen Fehler gefunden.
Hast trotzdem super arbeit gemacht!

Hab meinen Parser noch mal neu geschrieben und die rekursion rausgefeuert.
Aber mit deinem kann er nicht mithalten <)
SebastianJu2
Beiträge: 180
Registriert: 24.09.2010 10:39

Re: JSON Encoder und Decoder

Beitrag von SebastianJu2 »

@PMV

Danke für den Code... funktioniert super...

Ich habe Zeile 596 der pbi aber abgeändert auf:

Code: Alles auswählen

  If Size > 0
    Dim *obj\a(Size)
  EndIf
weil das JsonRPC-Protokoll scheinbar ab und zu params ohne Inhalt zu erwarten scheint. Also

"params" : [ ]

Mit

Code: Alles auswählen

JSON_dimArray(@AskJson\o("params"), 0)
geht das dann... Ohne die Änderung kommt mit 0 eine Fehlermeldung und mit 1 würde in den eckigen Klammern eine 0 stehen was in meinem Fall einen Fehler im Protokoll verursacht hat.

Keine Ahnung ob man die Änderung so stehen lassen kann oder nicht...
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: JSON Encoder und Decoder

Beitrag von PMV »

Oh, das muss natürlich funktionieren, in der JSON-Spezifikation sind
leere Arrays (und Objekte) auch drin. Leider hab ich das irgend wie
komplett vergessen ... also deine Änderung wäre eine Möglichkeit,
aber denk dran, das wenn du "Dim" weg lässt und dann die Prozedur
für bereits benutzte Arrays verwendest, bleiben alle vorher dimensionierten
Elemente bestehen.

Ich hab aber so bald keine Zeit um mir hier drüber mal Gedanken zu
machen. Insbesondere weil es sich auch eigentlich erst dann lohnt,
wenn ich dann das Resetten von tatsächlich erstellen Objekte
mal einbaue und ausführlich teste. Aber nicht so bald ...

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 »

+ bugfix: leere Arrays "[]" sind nun möglich
+ bugfix: Backslashes in Strings führt nun nicht mehr zu Abstürzen
+ geändert: JSON_newObject() ist nur noch zum initialisieren eines leeren Json-Objekts
+ geändert: JSON_free() ist nun ein Macro
+ hinzugefügt: Macro JSON_newPair() (früheren JSON_newObject(), siehe Beispiel)
+ hinzugefügt: JSON_clear()
+ verbessert: JSON_dimArray() und JSON_newObject() resetten nun das übergebene Objekt


JSON_dimArray() und JSON_newObject() rufen nun bei bereits benutzten
Strukturen JSON_clear() auf. Es wurden aber keine umfangreichen Tests
durchgeführt. Ich hab leider keine Zeit und bisher keinen Nutzen für JSON,
sorry. Bitte fleißig testen und evt. Probleme melden. :)


Wichtig:
Information für alle, die das alte JSON_newObject() (bis 03.05.2011)
nutzen und auf die neuste Version (ab 15.10.2011) aktualisieren wollen.
Die Änderung ist vorallem kosmetischer Natur, damit der resultierende
Code lesbarer ist. JSON_newObject() hat tatsächlich in erster Linie
Name/Wert-Paare erstellt. Lediglich der erste Aufruf für ein Objekt hat
dieses auch initialisiert. Wer auf diese Funktion aufgebaut hat, kann
einfach alle Quellcodes durchlaufen lassen und JSON_newObject() mit
JSON_newPair() austauschen. JSON_newPair() wird in Zeile 601
definiert. Der dort auskommentierete aufruf "Zeile 602: ;JSON_newObject()"
muss einkommentiert werden. Nun macht JSON_newPair() genau
das gleiche, wie vorher JSON_newObject(). Wer seinen Code lieber
lesbarer und noch nicht so viele Zeilen Code hat, der beachte das
Beispiel, wie die zwei Befehle nun zu nutzen sind.


(Beispiel zu JSON_newObject() und JSON_newPair())

Code: Alles auswählen

#JSON_UseObjectPointer = #True
IncludeFile "JSON_Parser.pbi"

Define *myJSON.jsonObj = JSON_create()
JSON_newObject(*myJSON)
JSON_newPair(*myJSON, "myString")
*myJSON\o("myString")\s = "text"
JSON_newPair(*myJSON, "myObject")

JSON_newObject(*myJSON\o("myObject"))
JSON_newPair(*myJSON\o("myObject"),  "value")
             *myJSON\o("myObject")\o("value")\i = 49
JSON_newPair(*myJSON\o("myObject"),  "nullValue")
             *myJSON\o("myObject")\o("nullValue")\type = #JSON_Type_Null
             
JSON_Debug(*myJSON, "")
JSON_free(*myJSON)
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON Encoder und Decoder

Beitrag von Kiffi »

Danke! :allright: Werde mich in Zukunft mal ein wenig intensiver
mit JSON befassen. Da kommt mir Dein Code grade recht.

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 »

+ bugfix: Wenn JSON_decode() auf eine Zahl stieß, auf die eine ]-Klammer folgte, wurde die Zahl nicht erkannt und #False zurück gegeben


Wenn man bedenkt, das ich das gleiche auch schon mit der geschweiften
Klammer gefixed hab ... oh weh. :oops:
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 17.07.2012
+ hinzugefügt: JSON_freeStringBuffer() für Fälle bei denen JSON_encode() sehr große Strings verarbeitet hat und anschließend kein weiteres JSON verarbeitet muss.
+ hinzugefügt: zusätzlicher Parameter "initialize" für JSON_clear(), kann auf #False gesetzt werden damit das Objekt nicht automatisch wieder initialisiert wird (früheres Verhalten).
+ verbessert: Speicherverwaltung für JSON_encode() eingebaut, was diesen um ein vielfaches schneller macht
+ verbessert: JSON_clear() ruft nun am Ende automatisch InitializeStructure() auf, damit das übergebene Objekt wieder nutzbar ist.


Habs leider ganz vergessen und nu isses auch schon so lang her.
Kann also nicht mehr sagen wie viel schneller das nun genau ist.
Um ein vielfaches wars aber glaub schon, also JSON_encode()
ist nun auch für große Mengen geeignet. :)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON Encoder und Decoder

Beitrag von Kiffi »

Jetzt schon mal ein dickes Danke für Deine tolle Arbeit! :allright:

Schaue ich mir morgen mal in Ruhe an...

Grüße ... Kiffi
a²+b²=mc²
Antworten