Sven Rautenberg: Validität von JSON Daten

Beitrag lesen

Moin!

ich wandel einen SAX Stream per XSLT in JSON. Das klappt soweit ganz gut. den Mimetype kann ich dabei frei wählen, derzeit ist es "application/json"
die output Methode lautet:
<xsl:output method="text" encoding="UTF-8" indent="no" />

Empfangen werden sie im Frontend per Ajax. Gewandelt dann, wie üblich mit eval().

Das ist sehr gefährlich. Damit wird jegliches Javascript ausgeführt, was der Ajax-Request empfängt. Vernünftiges JSON-Parsing vermeidet eval().

die übliche JSON Notation ist:

{"artikel":{["a","b","usw"...

Nun zum Probl. In den Daten sind auch " vorhanden. Also verwende ich einfach ', das einfach Hochkomma:

Deine XSLT-Transformation ist kaputt. In den Daten darf " nur als " vorkommen.

{'artikel':{['a','b','usw'...

Somit machen " keine Probleme mehr. Allerdings meckert dabei das FF Addon "JSONView", die Datenstruktur sei invalide. Meine Test liefen zufriedenstellend. eval() jedenfalls meckert nicht und JSON wird einwandfrei gewandelt.

Und was ist dann mit ' in den Daten? Problem nicht gelöst, nur verschoben.

JSON ist ja nunmal aufs engste mit JS verknüpft. Bei JS ist es gleich ob ich einen String

mystring = "string";

oder so:
mystring = 'string';


> schreibe. Ergo sollten auch meine ' in JSON erlaubt sein.  
  
JSON ist definiert. Siehe dazu diese praktische Website: <http://www.json.org/>  
  
Dort ist eindeutig gefordert, dass nur " als Begrenzerzeichen verwendet wird, und dort ist ebenfalls das vorgeschriebene Escaping für alles aufgeführt. JSON ist ein so simples Format, dass es eigentlich recht einfach sein sollte, sich dafür eine Transformation in XSLT zu schreiben.  
  

> Kann mir das dennoch irgendwann zum Verhängnis werden? Gibt es evtl. Browser die das gar nicht mögen und bei eval() aussteigen? sollte ich besser "text/json" als Mimetype nehmen?  
  
Der vorgeschriebene Mime-Type für JSON ist "application/json". Die üblichen Javascript-Bibliotheken werten sowas auch aus - und schicken netterweise im Request-Header auch mit, dass es sich um einen Ajax-Request handelt, das aber nur nebenbei erwähnt.  
  
 - Sven Rautenberg