JSON und PHP
Die Befehle json_encode und json_decode sind teil der JSON Extension.
In phpinfo() kann man sehen ob diese Extension aktiviert ist:

JSON als Austauschformat
Abschnitt betitelt „JSON als Austauschformat“Nicht alles was in JavaScript möglich ist wird in PHP als JSON akzeptiert.
Anführungszeichen
Abschnitt betitelt „Anführungszeichen“In Javascript müssen attribute nicht in Anführungszeichen stehen:
{ prop1 : "Schokolade", prop2 : 42, }Wenn JSON als Austauschformat zwischen Sprachen verwendet wird, dann müssen alle Attribute in Anführungszeichen stehen:
{ "prop1" : "Schokolade", "prop2" : 42, }Keine Funktionen
Abschnitt betitelt „Keine Funktionen“In Javascript kann ein Wert in JSON-Schreibweise auch Funktionen enthalten:
{ 'prop1' : 'Schokolade', 'prop2' : 42, 'method_1' : function (x) { return x + ' ist schlecht' }, 'method_2' : x => x + ' ist gut' }Wenn JSON als Austauschformat zwischen Sprachen verwendet wird darf es keine Funktionen enthalten.
$json_string = "{ 'prop1' : 'Schokolade', 'prop2' : 42, 'method_1' : function (x) { return x + ' ist schlecht' }, 'method_2' : x => x + ' ist gut' }";
$data = json_decode($json_string);
if( $data == null ) { echo json_last_error_msg(); // Output: "Syntax Error" exit(); }In PHP wird das gesamte JSON-Objekt verworfen, der Rückgabewert ist null
und json_last_error_msg() gibt “Syntax Error” zurück.
Serialisierung
Abschnitt betitelt „Serialisierung“Der PHP Befehl lautet json_encode.
Welche Datenstrukturen von PHP lassen sich zu JSON serialisieren?
Ein PHP Objekt lässt sich als JSON Objekt darstellen:
$object = new stdClass();$object->foo = 30;$object->name = "Alice";echo json_encode( $object );// {"foo":30,"name":"Alice"}Ein “normales” Array mit Integer als Index lässt sich direkt auf JSON abbilden:
$array = array( "Apple", "Banana" );echo json_encode( $array );// ["Apple","Banana"]Assoziatives Array
Abschnitt betitelt „Assoziatives Array“Jedes Array kann in PHP auch Strings als Index enthalten. Ist das der Fall, dann wird es in JSON als Objekt dargestellt:
$array = array( "foo" => 30, "name" => "Alice");echo json_encode( $array );// {"foo":30,"name":"Alice"}In JSON gibt es keine Entsprechung für das Assoziative Array in PHP. Deswegen wird es als Objekt dargestellt.
Deserialisierung
Abschnitt betitelt „Deserialisierung“Wie sollen nun JSON-Objekt zu PHP übersetzt werden? Als Objekt oder als Assoziatives Array?
Hier gibt es zwei Varianten, die man über das zweite Argumente von json_decode unterscheidet.
decode false
Abschnitt betitelt „decode false“false als zweites Argument oder gar kein zweites Argument bewirkt, dass
alle JSON-Objekte zu PHP-Objekten übersetzt werden
$string = '{"name":"Alice"}';$o = json_decode( $string );var_export( $o );// stdClass Object// (// [name] => Alice// )echo "Wert von name: " . $o->name;// Alicedecode true
Abschnitt betitelt „decode true“true als zweites Argument bewirkt, dass
alle Objekte als assoziative Arrays decodiert werden.
$string = '{"name":"Alice"}';$o = json_decode( $string, true );print_r( $o );// Array// (// [name] => "Alice"// )echo "Wert von name: " . $o['name'];// AliceJSON als Rückgabewert
Abschnitt betitelt „JSON als Rückgabewert“Normalerweise liefert ein PHP Programm als Output HTML. Wenn man statt dessen JSON ausliefern will muss man den HTTP-Header ‘Content-Type’ und eventuell den HTTP Response Code entsprechend setzen.
header("Content-type: application/json; charset=utf-8");http_response_code(200);echo json_encode($data);Aus einer JSON Datei
Abschnitt betitelt „Aus einer JSON Datei“Mit dem Befehl file_get_contents kann man den gesamten Inhalt einer Datei lesen:
$string_or_false = file_get_contents('some_data.json');if($string_or_false == false) { echo "Error reading file"; exit();}$data = json_decode($string, true);Referenz
Abschnitt betitelt „Referenz“beantwortet: 0 / 0 (0%)
richtig: 0 / 0 (0%)