json_encode für komplexe objekte
bearbeitet von
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
//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
~~~js
// 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:
~~~php
$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.
_Rolf_
--
sumpsi - posui - clusi
json_encode für komplexe objekte
bearbeitet von
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
//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
~~~js
// 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:
~~~php
$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);
~~~
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.
_Rolf_
--
sumpsi - posui - clusi
json_encode für komplexe objekte
bearbeitet von
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
//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
~~~js
// 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: 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:
~~~php
$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);
~~~
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.
_Rolf_
--
sumpsi - posui - clusi
json_encode für komplexe objekte
bearbeitet von
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
//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
~~~js
// 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: 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.
Wie wär's hiermit:
~~~php
$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);
~~~
Das Ermitteln des Short-Text aus dem post_content lagerst Du in eine Funktion aus, dann hast Du lesbareren Code, kannst sie separat testen und vielleicht sogar wiederverwenden.
_Rolf_
--
sumpsi - posui - clusi