JSON::eval() 0.1a - EINFACHER Zugriff auf JSON Objekte

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.
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

JSON::eval() 0.1a - EINFACHER Zugriff auf JSON Objekte

Beitrag von Derren »

Thread im englischen: http://purebasic.fr/english/viewtopic.php?f=12&t=60656

Ich verweise einfach mal auf den thread im englischen für den (aktuellsten) Code.
Wer nicht im englischen Forum ist kann natürlich Fragen und Anregungen hier posten.

Ganz kurz auf deutsch: Als ich im 5.3 changelog von einer json-lib gelesen habe, hab ich mich tierisch gefreut. Aber dieses rumgewurschtel mit Objekt IDs und weiß der Geier alles ist mir ehrlich gesagt zu blöd.

In Javascript geht das ganz einfach (dieser Code ist ein weniger vereinfacht, aber demonstriert wie einfach
es ist)

Code: Alles auswählen

json = {foo:bar}; 
print(json.foo); //prints "bar"
Und mit meinem Modul das gleiche in PB

Code: Alles auswählen

Define json.s = "{foo:bar}"
JSON::eval(json)
Debug JSON::Get("foo") ; will debug: bar
Wer postet mal kurz wie das in nativem PB aussieht mit der neuen Lib? Und vor allem mit komplexeren Strukturen? Nein danke...

Hier nur ganz kurz der DeclareModule Block und ein kurzes Beispiel (so nicht lauffähig). Der Rest wie gesagt im englischen Forum.

Noch ganz kurz die Info auch auf deutsch: Keine Validierung. Wenn der json string Murks ist, liefert das Modul auch Murks als Ergebnis. Kein Typen Support. Alle Werte sind Strings. Auch Arrays (die noch kräftig überarbeitet werden müssen).
Momentan kann nur ein json String auf einmal gelesen werden, bzw, wenn man einen mit gleichen Schlüsselnamen einliest wird der vorherige z.T. überschrieben.
Die Schlüssel sind case sensitive. Ein entsprechendes Flag werde ich noch einbauen.

Code: Alles auswählen

DeclareModule
    Declare eval(input.s)   ; Should return 0. If not, there's an error in object depth, e.g. "{key:value,key2:{object}" (closing paranthesis missing)
    Declare.s GET(key.s)   ; Returns the value for the given key as a string
EndDeclareModule
;...
;-
;-EXAMPLE

Define json.s = "{"  ;copied from Wikipedia and edited to add more variety
json + "	'Company': 'Xema',"
json + "	'Number': '1234-5678-9012-3456',"
json + "	'Exponent': 2e+6,"
json + "	'Currency': 'EURO',"
json + "	'Person': {"
json + "		'Name': 'Mustermann',"
json + "		'First Name': 'Max',"
json + "		'male': true,"
json + "		'Hobbys': [ 'Hiking', 'Golf', 'Reading' ],"
json + "		'Age': 42,"
json + "		'Children': [{name:julia},{name:hans}],"
json + "		'Spouse': null"
json + "	}"
json + "}":ReplaceString(json, "'", Chr(34), #PB_String_InPlace)


JSON::eval(json)

Debug "Company: "+			JSON::GET("Company")
Debug "Number: "+			JSON::GET("Number")
Debug "Person: "+			JSON::GET("Person") + "<< empty, as it's an object and not a real value"
Debug "Person -> Name: "+	JSON::GET("Person\Name")
Debug "Person -> Hobbys: "+	JSON::GET("Person\Hobbys")
Debug JSON::GET("Person\Children\name") ;this is not a proper key, it should be an array index. This needs to be fixed
Signatur und so