Suchen
Inside Wiki
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard JSON

 

Inhalte

JSON


Grundlegendes


JSON (JavaScript Object Notation) wurde erdacht von Douglas Crockford, der nach wie vor die offizielle Homepage unterhält. Die Ziele von JSON sind recht ambitiös: Es soll nicht mehr und und nicht weniger sein, als ein vollständiger Ersatz für XML. Ob JSON diesem Anspruch tatsächlich gerecht wird, soll hier nicht diskutiert werden, aber fest steht, daß JSON ein ideales Medium fuer den Datenaustausch zwischen PHP und JavaScript ist. Mit Hilfe von JSON lassen sich Variablen beliebigen Typs mit nur einer einzigen Zeile Code von PHP nach JavaScript umwandeln (und umgekehrt).

Syntax


Die Diagramme auf json.org sind wohl erstmal etwas einschüchternd, aber in Wahrheit ist JSON sehr sehr simpel. Jeder der JavaScript beherrscht, beherrscht JSON bereits. JSON-Strings sind nichts weiter als JavaScript-Literals:
Code:
var n = 1.5;             // '1.5' ist ein Number-Literal
var b = true;            // 'true' ist ein Boolean-Literal
var s = "beispiel";      // '"beispiel"' ist ein String-Literal
var a = [1,2] ;          // '[1,2]' ist ein Array-Literal und
var o = {"x":10,"y":5};  // '{"x":10,"y":5}' ist ein Object-Literal

Jedes einzelne dieser Literals ist gültiges JSON. Selbstverstaendlich sind auch beliebig komplexe Verschachtelungen dieser Basistypen moeglich. Da JSON zum Datenaustausch zwischen verschiedenen Programmiersprachen gedacht ist, sind Function-Literals allerdings unzulaessig! Auch gehen Klassen- bzw. Prototypeninformationen bei der Umwandlung verloren.

PHP


JSON schreiben mit PHP


Objekte und Arrays


PHP bietet seit Version 5.2 standardmässig die Funktion json_encode. Damit lassen sich beliebige PHP-Variablen nach JavaScript transcodieren. Bei komplexen Variablen wie Objekten und Arrays ist der Nutzen offensichtlich:
PHP Quellcode:
<?php

$PHPvariable = new stdClass;
$PHPvariable->zahl  = 5;
$PHPvariable->text  = 'beispiel';
$PHPvariable->liste = array('a' => 1, 'b' => array(100, 200));

?> 
<script type="text/javascript">
 
    var JSvariable = <?php echo json_encode($PHPvariable); ?>;
 
</script>

Und so sieht der hier erzeugte JSON-String aus:
Code:
{"zahl":5,"text":"beispiel","liste":{"a":1,"b":[100,200]}}

Tipp:

PHP kennt - anders als JS - keine Object-Literals. Man kann sie aber leicht simulieren:
PHP Quellcode:
$objekt = (object)array('eins' => 1, 'zwei' => 2);

Ein so erzeugtes Objekt ist vom Typ "stdClass".

Strings


Der Einsatz von JSON lohnt sich aber nicht nur bei Objekten und Arrays. Auch bei Strings sollte man JSON benutzen. JavaScript kennt eine Reihe von Einschränkungen, was die in Strings erlaubten Zeichen angeht. So sind z.B. Zeilenumbrüche in JS-Literals verboten - stattdessen muss man "\n" benutzen. Desweiteren sorgen Anführungszeichen und Apostrophe für dieselben Probleme wie in PHP-Literals. undsoweiter... JSON erzeugt für diese und noch eine Reihe weiterer Problemzeichen die korrekten Escape-Sequenzen und nimmt dem Entwickler damit ein wirklich lästiges Stück Arbeit ab.

Warnung:
Achtung, Stolperfalle! Bei JS-String-Literals gehören die Anführungszeichen bereits dazu. Die übernimmt also JSON! So ist's also richtig:
Code:
var JSstring = <?php echo $PHPstring; ?>;

aber das ist völlig falsch:
Code:
var JSstring = "<?php echo $PHPstring; ?>";

JSON lesen mit PHP


Das Lesen von JSON ist ewas exotischer als das Schreiben, da JS, nur wenn man AJAX einsetzt, die Möglichkeit hat, Anfragen an den Server und damit an PHP zu senden. Hier kommt json_decode zum Einsatz. Da JSON-Strings nicht vom Typ 'application/x-www-form-urlencoded' sind, finden sich die eingehenden Daten weder in $_GET noch in $_POST. Stattdessen muss man 'php://input' bemühen:
PHP Quellcode:
$JSvariable = file_get_contents('php://input');
$PHPvariable = json_decode($JSvariable);

JavaScript


json2.js


Obwohl JSON eine Untermenge von JavaScript ist, verfügt JavaScript selbst weder über eine Funktion zum Schreiben, noch über eine Funktion zum (sicheren) Lesen von JSON. Deshalb muß man sich erstmal die json2.js auf den eigenen Server kopieren. Bei manchen JavaScript-Libraries ist JSON allerdings bereits enthalten, so daß man sich diesen Schritt u.U. sparen kann.

JSON schreiben mit JavaScript


Um eine JS-Variable in einen JSON-String zu verpacken, nimmt man die in der json2.js enthaltene Funktion JSON.stringify. Zusätzlich sollte man darauf achten den Content-Type des Requests auf "text/json" zu setzen.
HTML Quellcode:
<script src="json2.js" type="text/javascript"></script>
<script type="text/javascript">
var JSvariable = new Array(1, 2);
var jsonString = JSON.stringify(JSvariable);
httpRequest.open('POST', 'http://www.example.org/', true);
httpRequest.overrideMimeType('text/json');
httpRequest.send(jsonString);
</script>

JSON lesen mit JavaScript


Da JSON nichts anderes ist als JavaScript, ist es verführerisch eval zu benutzen:
HTML Quellcode:
<script type="text/javascript">
httpRequest.onreadystatechange = function() {
    if (httpRequest.readyState == 4 && httpRequest.status == 200) {
        variableAusPHP = eval(httpRequest.responseText);
    }
}
</script>

Dies sollte man jedoch tunlichst vermeiden, da es Sicherheitsrisiken birgt. Es ist leider nicht auszuschließen, daß es Dritten gelingt, sich zwischen Client und Server zu schalten und den responseText zu manipulieren. Im "günstigsten" Fall enthält der responseText dann ungültige Literals. Im schlimmsten Fall enhält er aktiven JavaScript-Code...

Stattdessen sollte man die in der json2.js enthaltene Funktion JSON.parse verwenden:
HTML Quellcode:
<script src="json2.js" type="text/javascript"></script>
<script type="text/javascript">
httpRequest.onreadystatechange = function() {
    if (httpRequest.readyState == 4 && httpRequest.status == 200) {
        variableAusPHP = JSON.parse(httpRequest.responseText);
    }
}
</script>

Damit ist zumindest gewährleistet, daß man syntaktisch korrekte Literals erhält. Die Integrität der Daten kann JSON.parse natürlich auch nicht garantieren. Es ist daher empfehlenswert Daten aus XMLHttpRequests mit dem selben Mißtrauen wie Benutzereingaben zu betrachten.

Quellen


json_encode
json_decode
JSON Homepage
json2.js
Wikipedia Eintrag
Convert XML to JSON in PHP


Mitwirkende: mYkon, pecos, johnpatcher, JONeill
Erstellt von pecos, 05.02.2008 am 19:09
Zuletzt bearbeitet von mYkon, 01.03.2011 am 15:56
0 Kommentare , 10733 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
ajax, javascript, json, xml, xmlhttprequest

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Flash --> JSON -->PHP Pippert PHP 3 27.11.2007 08:53
x-json Umlaute Problem Stefan125 JavaScript 0 01.11.2007 16:40
x-json Variablen gruppieren ? Stefan125 JavaScript 1 31.10.2007 14:53
AJAX JSON spielerz PHP 5 19.07.2007 09:25
JSON ohne json.js? Andreas Franke JavaScript 1 14.03.2007 10:58


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:10 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC