Rolf B: json_encode für komplexe objekte

Beitrag lesen

Hallo,

Bleibt trotzdem die Frage, warum du ein Array als Objekt und nicht als richtiges Array darstellen möchtest.

Vielleicht, weil er es nicht besser weiß?

Werkstudent, ein Array von Objekten lässt sich in JSON auch darstellen, ohne die Array-Indexe vorneweg zu stellen. Das hat Du in deinem eingangs gezeigten bla bla bla Beispiel schon selbst demonstriert.

Wenn Du UNBEDINGT die von Dir gezeigte Objektstruktur mit Indexen als Schlüssel haben willst, dann hast Du in PHP ein Problem, weil PHP numerisch aussehende Schlüssel als Indexe behandelt, d.h. selbst wenn Du in deiner bla bla bla Demo schreiben würdest:

//php
$arrays= array( "0" => $arr1, "1" => $arr2 );

dann würde json_encode immer noch eine Array-Struktur erzeugen, keine Objektstruktur.

Aber wie gesagt - warum überhaupt eine Objektstruktur erzwingen? Du kannst im Javascript das von PHP encodete Array genauso gut verarbeiten wie ein Objekt

// Javascript
a = [ { bla: 10 }, { bla: 12 }, { bla: 14 } ];
console.log(a[1].bla);      // -> 12
console.log(a["1"].bla);    // -> ebenfalls 12

Zu deinem kaputten json_encode Ergebnis vom Anfang: Es sieht so aus, als würdest Du jede Zeile einzeln encoden, das Ergebnis in ein Array stellen und dann das Array nochmal encoden. Das KANN man machen, aber weder muss noch sollte man es tun. Die "false" Einträge deuten darauf hin, dass dein innerer json_encode auf einen Fehler gelaufen ist. Welcher das ist, lässt sich so nicht sagen; ich weiß ja auch nicht was Du da sonst noch drumherum gemacht hast.

Aber wie wär's hiermit:

$zeilen = ARRAY();       // oder: $zeilen = [];
while($row = mysqli_fetch_assoc($result)) {
   $zeilen[] = ARRAY("titel" => htmlspecialchars($row["post_title"]), 
                     "content" => htmlspecialchars(getShortText($row["post_content"])));
}
$json_string = json_encode($zeilen);

$zeilen[] = blablabla ist ein kompakter array_push.

Die Verwendung von json_encode nimmt Dir die Arbeit ab, deine Inhalte JSON-konform zu maskieren. Und htmlspecialchars nimmt Dir die Arbeit ab, Sonderzeichen zu maskieren, die Dir ggf. das HTML-Layout zerreißen.

Das Ermitteln des Short-Text aus dem post_content lagerst Du sinnvollerweise in eine Funktion aus, dann hast Du lesbareren Code, kannst sie separat testen und vielleicht sogar wiederverwenden. Gefällt dem Prof bestimmt :)

Bekommst Du aus dem json_encode ein false heraus, müsstest Du mal zu Beginn des PHP Scripts error_reporting(E_ALL) aufrufen und die Ajax-URL direkt in die Browser-Adresszeile eingeben, dann müsstest Du entstehende Fehler zu sehen bekommen. Du kannst auch die Funktion json_last_error() benutzen, um im false-Fall weitere Informationen zu erhalten. Vermutlich ist es ein encoding-Problem; json_encode erwartet UTF-8 codierte Strings. Wenn Du in deinem Script nicht mit UTF-Strings arbeitest (sprich: deine DB-Verbindung latin-1 codierte Strings liefert), dann kannst Du mit utf8_encode() nachhelfen.

Rolf

--
sumpsi - posui - clusi