JSON sucks

  • Ersteller Ersteller omaliesschen
  • Erstellt am Erstellt am
O

omaliesschen

Gast
Hi,

JSON ist ein nettes Konzept aber es ist nervend umzusetzen bzw. schwierig die Daten zu bereinigen.

Beispiel:

Text über ajax an ein php Skript senden und später mittels php als JSON array an eine JS Funktion übergeben.

Auf der php Seite müssen nach dem auslesen die Inhalte aufgearbeitet werden. EInfache regex basierte preq_replaces funktionieren nicht. Stichwort einfach.

Ersetze ich \n mit \\n OK sofern der Nutzer nicht \\n in die DB schreibt. Oder \\\\n \\\\\\n....

Gibt es fertige libs dafür?
 
Und was hat das jetzt mit JSON zu tun, dass du Schwierigkeiten hast Zeichen zu escapen?
 
Nicht so ganz.

Ich hatte eval() genutzt anstelle von JSON.parse da JSON.parse nicht funktionieren wollte. Den Grund hatte ich bisher nicht gefunden. Egal was ich versucht hab JSON.parse ging nicht.

Es muss ein mehrdimensionales Array aus dem JSON string gemacht werden. Linebreaks beibehalten.

Code:
{"loaded_msg": 
    {"msg_detail":[ 
	{"msg_id":  "1",
	    "user_id": "1",
	    "user_name": "root",
	    "msg_text": "Mail delivery failed",
	    "send_time": "00.00h"
	},{"msg_id":  "2",
	    "user_id": "1",
	    "user_name": "root",
	    "msg_text": "Mail delivery failed",
	    "send_time": "00.01h"
	} ]
}
}
Ergänzung ()

thes33k schrieb:
Und was hat das jetzt mit JSON zu tun, dass du Schwierigkeiten hast Zeichen zu escapen?

Das wir nicht mehr im Mittelalter liegen und man eigentlich erwarten sollte dass solch strikte Vorschriften in dem Kontext überflüssig sind?

Oder es evtl. build in Funktionen gibt die nicht nur einen Teil escapen.
 
Zuletzt bearbeitet:
1. Vergiss eval(). JSON.parse() muss funzen, sofern dein übergebenes JSON valide ist: jsonlint.com.
2. Mit deinen Quotes um Zahlen schmeisst du einen großen Aspekt von Typisierung weg, den JSON liefert.
3. Es liegt immer in deiner Verantwortung übergebene Strings zu validieren. Es gibt keine 100% Lösung um alles valide zu escapen.
4. JSON suckt nicht, nur weil du es nicht hinbekommst.
 
Und damit ist das Rätsel auch gelöst... Dafür gibt es Funktionen wie trim()... bau deinen String auf und trim das rechte Komma weg.
 
Hi Hancock,

Funktioniert.


$json_wrapped = '{"loaded_msg":{"msg_detail":['.trim($json,',').']}}';
 
Zuletzt bearbeitet:
Ist in der Beziehung rtrim() eigentlich performanter als trim()? wär mal interessant...
 
Code:
    for($a=0;$a<3;$a++){
     
    $time = microtime(true);
    for ($i=0; $i < 1000000 ; $i++) {
    rtrim('Lorem Ipsum dolor,',',');
    }
    $rtrim = 'rtrim 1m rounds:&nbsp;'.(microtime(true)-$time).'s';
     
    $time = microtime(true);
    for ($i=0; $i < 1000000 ; $i++) {
    trim('Lorem Ipsum dolor,',',');
    }
    $trim = 'trim 1m rounds:&nbsp;'.(microtime(true)-$time).'s';

    $time = microtime(true);
    for ($i=0; $i < 1000000 ; $i++) {
    substr('Lorem Ipsum dolor,',0,-1);
    }
    $substr = 'substr 1m rounds:&nbsp;'.(microtime(true)-$time).'s';     

    echo $a.'.{<br />'.$rtrim.'<br />'.$trim.'<br />'.$substr.'<br />}<br />';
     
    }

EDIT: Skript wurde um substr() erweitert.



1.{
rtrim 1m rounds: 0.257068s
trim 1m rounds: 0.250162s
}
2.{
rtrim 1m rounds: 0.240265s
trim 1m rounds: 0.242723s
}
3.{
rtrim 1m rounds: 0.254512s
trim 1m rounds: 0.249998s
}
 
Zuletzt bearbeitet:
Habs mal um substr() erweitert, siehe obiges Skript. Für den Normaluser keine Unterschiede.

0.{
rtrim 1m rounds: 0.24865794181824s
trim 1m rounds: 0.24131011962891s
substr 1m rounds: 0.23891687393188s
}
1.{
rtrim 1m rounds: 0.2448308467865s
trim 1m rounds: 0.23440408706665s
substr 1m rounds: 0.23812198638916s
}
2.{
rtrim 1m rounds: 0.24020004272461s
trim 1m rounds: 0.23556017875671s
substr 1m rounds: 0.23891997337341s
}
 
Zuletzt bearbeitet:
Hancock schrieb:
Du darfst kein , am Ende von einem Array haben (das ist der einzige nervige Aspekt an JSON).

Was überhaupt kein Problem wäre, wenn man JSON und auch andere textbasierte Formate wie XML nicht mittels Stringmanipulation zusammenbasteln würde, genau so wie man beim Parsen kein Regex oder ähnlichen Quatsch anwendet.

edit: Und nervig ist das mit dem Komma wohl kaum, eher logisch.
 
Zuletzt bearbeitet:
:o
Code:
foreach ($sth as $r) { 

    $json[] = json_encode(sanitize($r)); 

}

$json_wrapped = '{"loaded_msg":{"msg_detail":['.implode(',', $json).']}}';
 
Zuletzt bearbeitet:
Was macht eigentlich diese sanitize-Methode genau? Und ist $sth ein String-Array?
 
Was hat dich daran gehindert, meine zwei Fragen zu beantworten? Dass sanitize eine Funktion und keine Methode ist? Interessant. Der Threadtitel ließ es schon vermuten, hier sitzt das Problem eher vor dem Bildschirm.

Wie carom sagte, solltest du JSON nicht manuell mittels String- und anderem Funktionen zusammenpfuschen, aber das bekommst du sicherlich alleine noch besser hin.
 
Zuletzt bearbeitet:
Der Threadtitel ließ es schon vermuten, hier sitzt das Problem eher vor dem Bildschirm.

Genau das. Ich riech Römer wie dich 200 Meter gegen den Wind. Warum sollte ich mich also mit Dir auseinandersetzen?

Dass sanitize eine Funktion und keine Methode ist?

Wenn schon besserwissen dann doch bitte auch besser wissen.


Wie niedlich.

Der Threadtitel ließ es schon vermuten, hier sitzt das Problem eher vor dem Bildschirm.

Vor dem Bildschirm sitzt ein Problem-Solver der es nicht befürwortet wenn alle zwei Meter neue Probleme auftauchen.

aber das bekommst du sicherlich alleine noch besser hin.
In welchem Realitätskonzept bist Du denn alle?
 
Zuletzt bearbeitet:
omaliesschen schrieb:


Dein Code aus Beitrag #15 ist niedlich, aber du bleibst offenbar gerne auf deinem Murks sitzen (nichts anderes ist es) und bevorzugst freche Antworten, statt dir helfen zu lassen. Fast an jedem deiner Posts ist zu erkennen, dass du nicht wirklich verstanden hast, dass sich JSON aus nahezu beliebigen Strukturen verschiedener Sprachen serialisieren lässt, ansonsten sind solche Aussagen kaum zu erklären:

JSON ist ein nettes Konzept aber es ist nervend umzusetzen bzw. schwierig die Daten zu bereinigen.
Oder es evtl. build in Funktionen gibt die nicht nur einen Teil escapen.

Am besten ist:

Vor dem Bildschirm sitzt ein Problem-Solver der es nicht befürwortet wenn alle zwei Meter neue Probleme auftauchen.

Verstehe ich, es ist nur dumm, wenn sich der Problemsolver beim lösen eines Problems _selbst_ Probleme in den Weg legt, die es nicht geben müsste.
 
Zuletzt bearbeitet:
Zurück
Oben