JSON: PHP und JavaScript

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • JSON ist ein kompaktes, unabhängiges Format Format zur Interoperabilität zwischen Anwendungen. Dieses Beispiel behandelt die Sprachen PHP und JavaScript.
    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.

    Quellcode

    1. Max;Mustermann;Musterstraße 11;11111 Musterstadt;


    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

    1. <?php
    2. // PHP Datenerhebung
    3. $data = array(
    4. array(
    5. 'firstname' => 'Max',
    6. 'lastname' => 'Mustermann',
    7. 'websites' =>
    8. array(
    9. 'http://www.easy-coding.de',
    10. 'http://www.coder-suche.de'
    11. )
    12. ),
    13. array(
    14. 'firstname' => 'Larry',
    15. 'lastname' => 'Page',
    16. 'websites' =>
    17. array(
    18. 'http://www.google.de',
    19. 'http://www.google.com',
    20. 'http://www.google.co.uk'
    21. )
    22. )
    23. );
    24. // PHP Daten ausgeben
    25. foreach($data as $row) {
    26. echo $row['firstname'];
    27. echo "<ul>";
    28. foreach($row['websites'] as $url) {
    29. echo "<li>{$url}</li>";
    30. }
    31. echo "</ul>";
    32. }
    33. ?>
    Alles anzeigen


    == Liste in JavaScript verarbeiten ==

    Quellcode

    1. <script type="text/javascript">
    2. // JavaScript Datenerhebung
    3. var data = new Object(
    4. {
    5. firstname : 'Max',
    6. lastname : 'Mustermann',
    7. websites : new Array(
    8. 'http://www.easy-coding.de',
    9. 'http://www.coder-suche.de'
    10. )
    11. },
    12. {
    13. firstname : 'Larry',
    14. lastname : 'Page',
    15. websites : new Array(
    16. 'http://www.google.de',
    17. 'http://www.google.com',
    18. 'http://www.google.co.uk'
    19. )
    20. }
    21. );
    22. // JavaScript Daten ausgeben
    23. for(var row in data) {
    24. var row = data[row];
    25. document.writeln(row['firstname']);
    26. document.writeln("<ul>");
    27. for(var url in row['websites']) {
    28. url = row['websites'][url];
    29. document.writeln("<li>"+url+"</li>");
    30. }
    31. document.writeln("</ul>");
    32. }
    33. </script>
    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.

    Quellcode

    1. <?php
    2. // PHP Datenerhebung
    3. $data = array(
    4. array(
    5. 'firstname' => 'Max',
    6. 'lastname' => 'Mustermann',
    7. 'websites' =>
    8. array(
    9. 'http://www.easy-coding.de',
    10. 'http://www.coder-suche.de'
    11. )
    12. ),
    13. array(
    14. 'firstname' => 'Larry',
    15. 'lastname' => 'Page',
    16. 'websites' =>
    17. array(
    18. 'http://www.google.de',
    19. 'http://www.google.com',
    20. 'http://www.google.co.uk'
    21. )
    22. )
    23. );
    24. // Brücke zwischen PHP und JavaScript (serverseitig)
    25. $json = json_encode($data);
    26. ?>
    27. <script type="text/javascript">
    28. // JavaScript Datenerhebung
    29. var json = '<?= $json ?>';
    30. // Brücke zwischen PHP und JavaScript (clientseitig)
    31. var data = eval('(' + json + ')');
    32. // JavaScript Daten ausgeben
    33. for(var row in data) {
    34. var row = data[row];
    35. document.writeln(row['firstname']);
    36. document.writeln("<ul>");
    37. for(var url in row['websites']) {
    38. url = row['websites'][url];
    39. document.writeln("<li>"+url+"</li>");
    40. }
    41. document.writeln("</ul>");
    42. }
    43. </script>
    Alles anzeigen


    Im Klartext sieht der JSON String folgendermaßen aus:

    Quellcode

    1. var json = '[{"firstname":"Max","lastname":"Mustermann","websites":["http:\/\/www.easy-coding.de","http:\/\/www.coder-suche.de"]},
    2. {"firstname":"Larry","lastname":"Page","websites":["http:\/\/www.google.de","http:\/\/www.google.com","http:\/\/www.google.co.uk"]}]';


    == Ä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

    1. require_once 'Services_JSON.php';
    2. class JSON {
    3. /**
    4. * @param objekt -> PHP Objekt/Array/Variable
    5. * @param force -> Benutzung von Service_JSON erzwingen
    6. * @return -> JSON String
    7. */
    8. static public function encode($objekt, $force=false) {
    9. if(!function_exists('json_encode') || $force) {
    10. $tmp = new Services_JSON();
    11. return $tmp->encode($objekt)
    12. } else {
    13. return json_encode($objekt);
    14. }
    15. }
    16. /**
    17. * @param str -> JSON String
    18. * @param force -> Benutzung von Service_JSON erzwingen
    19. * @return -> PHP Objekt/Array/Variable
    20. */
    21. static public function decode($str, $force=false) {
    22. if(!function_exists('json_decode') || $force) {
    23. $tmp = new Services_JSON();
    24. return $tmp->decode($str)
    25. } else {
    26. return json_decode($str);
    27. }
    28. }
    29. }
    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:

    Quellcode

    1. <?php
    2. require_once 'JSON.class.php';
    3. class Ob {
    4. public $arr = array("hans"=>"123", "peter"=>"456");
    5. public $x = 5;
    6. }
    7. $ob = new Ob();
    8. echo JSON::encode($ob);
    9. // Ausgabe = {"arr":{"hans":"123","peter":"456"},"x":5}

    16.640 mal gelesen