JSON und PHP

vorige Präsentation: JSON und JavaScript | zurück zum Buch-Kapitel [esc] | Nächste Präsentation Web Security

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

Nicht alles was in JavaScript möglich ist wird in PHP als JSON akzeptiert.

Anführungszeichen

In Javascript müssen attribute nicht in Anführungszeichen stehen:

Javascript Code OK in Javascript, nicht OK in PHP

  {
    prop1 : "Schokolade",
    prop2 : 42,
  }

Wenn JSON als Austauschformat zwischen Sprachen verwendet wird, dann müssen alle Attribute in Anführungszeichen stehen:

Javascript Code OK in allen Sprachen

  {
    "prop1" : "Schokolade",
    "prop2" : 42,
  }

Keine Funktionen

In Javascript kann ein Wert in JSON-Schreibweise auch Funktionen enthalten:

Javascript Code OK in Javascript, nicht OK in PHP

  {
    '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

Der PHP Befehl lautet json_encode.

Welche Datenstrukturen von PHP lassen sich zu JSON serialisieren?

encode

Objekt

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"}

Array

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

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

Wie sollen nun JSON-Objekt zu PHP übersetzt werden? Als Objekt oder als Assoziatives Array?

decode

Hier gibt es zwei Varianten, die man über das zweite Argumente von json_decode unterscheidet.

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;
// Alice

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'];
// Alice

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

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

JSON und PHP

vorige Präsentation: JSON und JavaScript | zurück zum Buch-Kapitel [esc] | Nächste Präsentation Web Security

/

#