JSON, kurz für JavaScript Object Notation und gesprochen wie der Name Jason, ist ein kompaktes Computer-Format in für Mensch und Maschine einfach lesbarer Textform, zum Zweck des Datenaustauschs zwischen Anwendungen.
== Wann benötigt man ein solches Format? ==
Wollen wir zum Beispiel ein Personen-Objekt aus unserer C# Desktop Anwendung an unseren PHP Internet Server senden, so benötigen wir neben den Internet Protokollen auch einen Standard um Daten zwischen C# und PHP auszutauschen.
Mit einer Semikolon-getrennten Liste kann man rudmentäre Daten super übertragen und in beiden Programmiersprachen ist es ein leichtes den Datensatz zu verwenden.
Verwenden wir stattdessen eine komplizierte, mehrdimensionale Struktur so sind diese s.g. CSV Datensätze nicht zu gebrauchen.
Eine Lösung muss her: In diesem Beitrag wird die Lösung JSON anhand einer häufig verbreiteten Kombination "JavaScript und PHP" erläutert.
Vergleichen wir zuerst wie wir eine Liste in beiden Sprachen ausgeben.
== Liste in PHP verarbeiten ==
Alles anzeigen
== Liste in JavaScript verarbeiten ==
Alles anzeigen
== Brücke von PHP nach JavaScript schlagen ==
Sieht man von den syntaktischen Unterschieden der Sprachen ab, haben wir das selbe Beispiel mit zwei verschiedenen Programmiersprachen umgesetzt.
In diesem Schritt wird die Brücke von PHP nach JavaScript geschlagen.
Als Eingabestream werden wir nicht mehr das JavaScript Array "data" - sondern serialisieren stattdessen das PHP Array zu einem JSON String.
Alles anzeigen
Im Klartext sieht der JSON String folgendermaßen aus:
== Ältere PHP Versionen ==
PHP 5 bringt ein Modul mit, dass, weil es in C geschrieben ist, sehr performant arbeitet. Leider ist es nicht in allen Installationen vorhanden. Daher würde ich euch empfehlen zweigleisig zu fahren und eine Schnittstelle einzuführen, die bei Existenz der C-Funktion diese bevorzugt, bei Nichtexistenz aber eine andere verwendet.
Diese Schnittstelle sieht folgendermaßen aus:
Alles anzeigen
Es verwendet Services_JSON, das unter der BSD Lizenz steht und hier erhältlich ist: pear.php.net/pepr/pepr-proposal-show.php?id=198
Nun zu einer Beispielimplementierung:
== Wann benötigt man ein solches Format? ==
Wollen wir zum Beispiel ein Personen-Objekt aus unserer C# Desktop Anwendung an unseren PHP Internet Server senden, so benötigen wir neben den Internet Protokollen auch einen Standard um Daten zwischen C# und PHP auszutauschen.
Mit einer Semikolon-getrennten Liste kann man rudmentäre Daten super übertragen und in beiden Programmiersprachen ist es ein leichtes den Datensatz zu verwenden.
Verwenden wir stattdessen eine komplizierte, mehrdimensionale Struktur so sind diese s.g. CSV Datensätze nicht zu gebrauchen.
Eine Lösung muss her: In diesem Beitrag wird die Lösung JSON anhand einer häufig verbreiteten Kombination "JavaScript und PHP" erläutert.
Vergleichen wir zuerst wie wir eine Liste in beiden Sprachen ausgeben.
== Liste in PHP verarbeiten ==
Quellcode
- <?php
- // PHP Datenerhebung
- $data = array(
- array(
- 'firstname' => 'Max',
- 'lastname' => 'Mustermann',
- 'websites' =>
- array(
- 'http://www.easy-coding.de',
- 'http://www.coder-suche.de'
- )
- ),
- array(
- 'firstname' => 'Larry',
- 'lastname' => 'Page',
- 'websites' =>
- array(
- 'http://www.google.de',
- 'http://www.google.com',
- 'http://www.google.co.uk'
- )
- )
- );
- // PHP Daten ausgeben
- foreach($data as $row) {
- echo $row['firstname'];
- echo "<ul>";
- foreach($row['websites'] as $url) {
- echo "<li>{$url}</li>";
- }
- echo "</ul>";
- }
- ?>
== Liste in JavaScript verarbeiten ==
Quellcode
- <script type="text/javascript">
- // JavaScript Datenerhebung
- var data = new Object(
- {
- firstname : 'Max',
- lastname : 'Mustermann',
- websites : new Array(
- 'http://www.easy-coding.de',
- 'http://www.coder-suche.de'
- )
- },
- {
- firstname : 'Larry',
- lastname : 'Page',
- websites : new Array(
- 'http://www.google.de',
- 'http://www.google.com',
- 'http://www.google.co.uk'
- )
- }
- );
- // JavaScript Daten ausgeben
- for(var row in data) {
- var row = data[row];
- document.writeln(row['firstname']);
- document.writeln("<ul>");
- for(var url in row['websites']) {
- url = row['websites'][url];
- document.writeln("<li>"+url+"</li>");
- }
- document.writeln("</ul>");
- }
- </script>
== Brücke von PHP nach JavaScript schlagen ==
Sieht man von den syntaktischen Unterschieden der Sprachen ab, haben wir das selbe Beispiel mit zwei verschiedenen Programmiersprachen umgesetzt.
In diesem Schritt wird die Brücke von PHP nach JavaScript geschlagen.
Als Eingabestream werden wir nicht mehr das JavaScript Array "data" - sondern serialisieren stattdessen das PHP Array zu einem JSON String.
Quellcode
- <?php
- // PHP Datenerhebung
- $data = array(
- array(
- 'firstname' => 'Max',
- 'lastname' => 'Mustermann',
- 'websites' =>
- array(
- 'http://www.easy-coding.de',
- 'http://www.coder-suche.de'
- )
- ),
- array(
- 'firstname' => 'Larry',
- 'lastname' => 'Page',
- 'websites' =>
- array(
- 'http://www.google.de',
- 'http://www.google.com',
- 'http://www.google.co.uk'
- )
- )
- );
- // Brücke zwischen PHP und JavaScript (serverseitig)
- $json = json_encode($data);
- ?>
- <script type="text/javascript">
- // JavaScript Datenerhebung
- var json = '<?= $json ?>';
- // Brücke zwischen PHP und JavaScript (clientseitig)
- var data = eval('(' + json + ')');
- // JavaScript Daten ausgeben
- for(var row in data) {
- var row = data[row];
- document.writeln(row['firstname']);
- document.writeln("<ul>");
- for(var url in row['websites']) {
- url = row['websites'][url];
- document.writeln("<li>"+url+"</li>");
- }
- document.writeln("</ul>");
- }
- </script>
Im Klartext sieht der JSON String folgendermaßen aus:
== Ältere PHP Versionen ==
PHP 5 bringt ein Modul mit, dass, weil es in C geschrieben ist, sehr performant arbeitet. Leider ist es nicht in allen Installationen vorhanden. Daher würde ich euch empfehlen zweigleisig zu fahren und eine Schnittstelle einzuführen, die bei Existenz der C-Funktion diese bevorzugt, bei Nichtexistenz aber eine andere verwendet.
Diese Schnittstelle sieht folgendermaßen aus:
Quellcode
- require_once 'Services_JSON.php';
- class JSON {
- /**
- * @param objekt -> PHP Objekt/Array/Variable
- * @param force -> Benutzung von Service_JSON erzwingen
- * @return -> JSON String
- */
- static public function encode($objekt, $force=false) {
- if(!function_exists('json_encode') || $force) {
- $tmp = new Services_JSON();
- return $tmp->encode($objekt)
- } else {
- return json_encode($objekt);
- }
- }
- /**
- * @param str -> JSON String
- * @param force -> Benutzung von Service_JSON erzwingen
- * @return -> PHP Objekt/Array/Variable
- */
- static public function decode($str, $force=false) {
- if(!function_exists('json_decode') || $force) {
- $tmp = new Services_JSON();
- return $tmp->decode($str)
- } else {
- return json_decode($str);
- }
- }
- }
Es verwendet Services_JSON, das unter der BSD Lizenz steht und hier erhältlich ist: pear.php.net/pepr/pepr-proposal-show.php?id=198
Nun zu einer Beispielimplementierung:
16.505 mal gelesen