Permafr0st: Validität von JSON Daten

tach.
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().

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:

{'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.

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.

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?

  1. Hi,

    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.

    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?

    Hmm, ich bin mal darüber gestolpert, aber ich kenne den Zusammenhang nicht mehr.

    Allerdings: bei Fragen zu JSON halte ich mich an json.org, und dort ist ein String nur mit " als Begrenzer erlaubt, nicht mit '.

    Bis die Tage,
    Matti

    -- Webapplikationen in C++ entwickeln
  2. 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

  3. Hallo,

    ich wandel einen SAX Stream per XSLT in JSON.

    Anscheinend verwendest du eine Eigenkonstruktion, um das JSON zu erzeugen. Das solltest du möglichst vermeiden, denn dabei kommt i.d.R. kein gültiges JSON heraus. Verwende einen echten JSON-Serialisierer, der nur gültiges JSON erzeugen kann.

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

    Die richtige Methode ist JSON.parse(). Diese wird von aktuellen Browsern bereits nativ unterstützt. Für ältere gibt es ein Script, das die Methode nachrüstet:
    https://github.com/douglascrockford/JSON-js

    JSON ist ja nunmal aufs engste mit JS verknüpft.

    JSON ist ein eigenes Format. Es hat nichts zwangsläufig mit JavaScript zu tun, man kann es auch in Systemen verwenden, wo JavaScript nicht vorkommt. Die einzige Überschneidung ist, dass ein JSON-String ein möglicher JavaScript-Objektliteral ist mit möglichen Array-, String-, Number- und Boolean-Literalen. »Möglich« heißt, dass JavaScript für diese Sprachbestandteile noch viele andere Schreibweisen kennt. JSON hingegen ist ein strenges Subset von JavaScript, nur manche Sprachbestandteile sind in einer bestimmten Syntax erlaubt.

    Mathias