Archiv verlassen und diese Seite im Standarddesign anzeigen : JSON und Linefeeds
Hallo Leute,
ich versuche hier, einen Text mit Linefeeds via JSON an eine Textarea zu schicken, bekomme dabei die Krise!
Verpacke ich alle Zeilen schön getrimmt in ein Array, was ich auf der Javascrit-Seite wieder auspacke, läuft die Sache. Ist aber nicht gewünscht, weil die gesamten Daten in CSV vorliegen, mit Linefeeds in den Feldern.
Problem: die Daten kommen zwar wie gewünscht rüber, aber der Javascript-Parser fällt mit eval auf die Nase, d.h. er bricht die Interpretation beim ersten Linefeed ab.
System: FF2.0.0.3 auf gentoo 686-64
Sender:php
$zeilen=implode(@file($filnam));
$out='{ "kenn":"'._PROGNAME.'", "aktion":"rohdaten", "daten": ';
$out=$out.'"'.$zeilen.'"';
$out=$out.' }';
Empfänger:javascript
function auswerten(my_text)
{ my_obj=eval('('+my_text+')');
if (my_obj) with(my_obj)
if (aktion=='rohdaten') document.form1.data_out.value=daten;
else if (.... (u.s.w.)
}
Was ist los?
so long,
BlueJay
undefined
09-05-2007, 20:35
Ohne XMLHttpRequest Objekt und onreadystatechange kann das nicht gehen.
Das XMLHttpRequest sorgt für die Konvertierung.
http://www.xulplanet.com/references/objref/XMLHttpRequest.html
Kleine Json Hilfe:
<?php
$arr = array(
"Kennnung" => "progname",
"Aktion" => true,
"Zeilen" => 10
);
$dec = json_encode( $arr );
$enc = json_decode( $dec );
var_dump( "<pre>", $arr, "</pre>" );
var_dump( "<pre>", $dec, "</pre>" );
var_dump( "<pre>", $enc, "</pre>" );
?>
Ausgabe:
array(3) {
["Kennnung"]=>
string(8) "progname"
["Aktion"]=>
bool(true)
["Zeilen"]=>
int(10)
}
"{"Kennnung":"progname","Aktion":true,"Zeilen":10}"
object(stdClass)#1 (3) {
["Kennnung"]=>
string(8) "progname"
["Aktion"]=>
bool(true)
["Zeilen"]=>
int(10)
}
Ohne XMLHttpRequest Objekt und onreadystatechange kann das nicht gehen.
Kleines Mistverständnis, :D das HTTPRequest-Objekt wird natürlich bedarfsweise erzeugt, aber der Teil schien mir mit meinem Problem eher nichts zu tun zu haben.
Das Konglomerat arbeitet ja bisher nahezu perfekt mit CSV-Paketchen, zudem handelt es sich IMHO um ein Problem der JSON- to Object-Konvertierung via eval.
Zudem kommt der JSON-String komplett, alle benötigten Daten sind enthalten und nach JSON-Konvention lt. Wikipedia aufgebaut ist (mit Alert gecheckt).
Einer dieser Daten, nämlich "daten" ist ein String mit \n (das Ding, was mit implode(@file...) eingelesen wird), der nach ecma-262 korrekt verarbeitet werden sollte. Aber eval scheint mir beim \n was zu husten, obwohl der String brav in Hochkommata eingeschlossen ist.
Zudem komme ich mit der rechten Spalte von json.org nicht zurecht, heisst das, dass \n im String nun vorkommen darf, oder bezieht sich die Liste mit den Steuerzeichen auf die Ausnahmen (das, was nicht im String vorkommen darf?)
Ich möchte nur wissen, ob ich das Linefeed (\n) anders vom php aus auf Reisen schicken muss, um nicht in die eval-Falle zu tappen.
Der Würgaround mit dem Schicken der Teilstrings als Array ist nicht sehr elegant und frisst den Vorteil von JSON gegenüber CSV auf (aus dem file direkt und unangespitzt/un-umformatiert zur Client-Textarea).
so long,
BlueJay
undefined
11-05-2007, 21:56
Hast du schon mit
eval(unescape(daten));
versucht.
Also im Normalfall kann Java Script einen json String mit \n\t verarbeiten.
http://www.very-clever.com/json.php
Also zumindest ist das, was das php-Teil abschickt, korrekte JSON-Syntax. :rolleyes:
(unescape)
Natürlich habe ich das probiert: die Interpretation seitens eval bricht ebenfalls genau an dieser Stelle ab. (FF 2.0.0.3/Linux x-64)
... und was macht er da? Unescaped die Linefeeds, und eval wirft wieder das Handtuch :(
Javascript verarbeitet \n im "Normalbetrieb" korrekt, die CSV-Variante kommt ja heile in der Textarea an, muss auch nicht durch eval, sondern nur ein split, shift und join über sich ergehen lassen.
Knackpunkt scheint also die Empfehlung zu sein, den Reply-String durch eval auswerten zu lassen. Eval bricht beim 1.Linefeed ab.
JS-Code:
function auswerten(my_text)
{ // try
{ my_obj=eval('('+my_text+')'); // hier knallt's
if (my_obj.kenn=='cat')
{ if (my_obj.aktion=='output') document.form1.chat_out.value=decodeURIComponent(m y_obj.daten);
else if (my_obj.aktion=='warnung') alert(warnung);
}
}
// catch (e) { alert(my_text); }
}
Fehlermeldung FF:
Fehler: unterminated string literal
Quelldatei: http://www.gamecraft.de/ajax_beta/chat/
Zeile: 26, Spalte: 50
Quelltext:
({ "kenn" : "cat", "aktion" : "output", "daten" : "Cat-Test
Man sieht, die 1. Zeile kommt an bis zum 1.Linefeed, dann geht's nicht weiter. Das JSON-Paket ist vollständig, wie man sieht, wenn man try/catch aktiviert.
Muss leider abbrechen, mein Quälgeist von Ehemann will wieder was von mir.
so long,
Bluejay
Hast du schon mit
eval(unescape(daten));
versucht.
Also im Normalfall kann Java Script einen json String mit \n\t verarbeiten.
http://www.very-clever.com/json.php
eval kann es nicht!
Aber du kannst Glück haben, wenn du diverse Sonderzeichen *doppelt* escaped auf Reisen schickst.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.