JSON und PHP – das dynamische Duo
Kommentare

JSON Encodieren in PHP
Noch vor einigen Jahren wurde die JSON-Unterstützung durch die json-pecl-Extension gewährleistet. Seit PHP 5.2 befindet sich der entsprechende Code direkt im Kern von PHP, sodass

JSON Encodieren in PHP

Noch vor einigen Jahren wurde die JSON-Unterstützung durch die json-pecl-Extension gewährleistet. Seit PHP 5.2 befindet sich der entsprechende Code direkt im Kern von PHP, sodass kein Modul extra dazuinstalliert werden muss.

Anmerkung: Sollte eine PHP Version älter als 5.3 im Einsatz sein, dann würde ich generell ein Upgrade empfehlen. PHP 5.3 ist die älteste Version, welche offiziell noch mit Updates versorgt wird und da in der letzten Zeit häufig Sicherheitslücken bekannt wurden würde ich ein Upgrade als kritisch betrachten.

Zurück zu JSON und PHP. Mit json_encode() können alle Datentypen (außer Ressourcen) nach JSON konvertiert werden, vorausgesetzt sie sind mittels UTF-8 codiert. „Klassische“ Arrays, also jene mit aufsteigendem numerischen Index, werden in JSON Arrays (mit eckigen Klammern) umgewandelt. Alle anderen Varianten (vor allem assoziative Arrays) werden in Objekte umgewandelt.

Der Funktionsaufruf ist einfach und sieht so aus:

 json_encode(mixed $value, int $options = 0);

Ein numerischer Wert statt einem Array als Argument für Optionen scheint auf den ersten Blick ungewöhnlich. Tatsächlich handelt es sich dabei um das – hauptsächlich in C gebräuchliche – Sprachkonstrukt einer Bitmaske. Diese werden etwas später ausführlicher behandelt. Da sie allerdings die Art des Encodings beeinflussen, gehen wir einfach von den Standardeinstellungen aus und geben keine speziellen Parameter an.

Sehen wir uns zuerst die grundlegenden Datentypen an. Die Ausgaben befinden sich direkt über den entsprechenden Aufrufen:

 "four", 8 => "eight"));

	// Ergibt: {"apples":true,"bananas":null}
	json_encode(array("apples" => true, "bananas" => null));
	?>

Wie das Array in PHP umgewandelt wird hängt also von den verwendeten Indizes ab. Des Weiteren sieht man, dass json_encode() die korrekten Datentypen verwendet, sodass boolsche Werte oder NULL nicht etwa zu einem String umgewandelt werden. Nun zu den Objekten:

firstname = "foo";
	$user->lastname  = "bar";

	// Ergibt: {"firstname":"foo","lastname":"bar"}
	json_encode($user);

	$user->birthdate = new DateTime();

	/* Ergibt:
		{
			"firstname":"foo",
			"lastname":"bar",
			"birthdate": {
				"date":"2012-06-06 08:46:58",
				"timezone_type":3,
				"timezone":"Europe/Berlin"
			}
		}
	*/
	json_encode($user);
	?>

Die Objekte werden analysiert und alle sichtbaren („public“) Attribute werden für die Umwandlung herangezogen. Dies passiert auch rekursiv, sodass im obigen Beispiel auch die Attribute des DateTime-Objekts umgewandelt werden. Dies ist eine einfache Möglichkeit, Datumsobjekte als JSON zu übertragen ohne sich viel mit der Konvertierung beschäftigen zu müssen.

func = function() {
				return "Foo";
			};
		}
	}

	$user = new User();

	// Ergibt: {"pub":"Mister X.","func":{},"notUsed":null}
	echo json_encode($user);
	?>

Dieses Beispiel verdeutlicht, dass nur nach außen hin sichtbare Attribute für die Konvertierung herangezogen werden. Nicht initialisierte Variablen werden als NULL dargestellt, während anonyme Funktionen (Closures) als leeres Objekt dargestellt werden (in der aktuellen Version von PHP ist es nicht möglich das umwandeln von Closures zu unterbinden).

Die $option Bitmasken

Bitmasken werden dazu verwendet, einzelne Flags zu aktivieren oder zu deaktivieren. Dieses Sprachkonstrukt findet sich häufig in C und da PHP in C geschrieben ist, wurde es für einige Funktionen übernommen. Die Benutzung ist einfach: Man verwendet Konstanten, um die Argumente anzugeben. Und falls es mehr als eines ist wird es mit dem „bitweisen Oder“ `|` konkateniert. Ein solcher Aufruf könnte wie folgt aussehen:

	

Durch JSON_FORCE_OBJECT wird nun jede Form des Arrays in ein Objekt umgewandelt, während mittels JSON_NUMERIC_CHECK Nummern, welche als String vorliegen, in den korrekten Datentyp konvertiert werden. Zu beachten ist, dass die meisten Konstanten erst in PHP 5.3 enthalten sind und manche erst seit 5.4. Die meisten der Konstanten verändern die Art, mit der bestimmte Zeichen codiert werden (hauptsächlich Zeichen mit speziellen Bedeutungen wie „, `&` oder `““`). Seit PHP 5.4 gibt es auch eine JSON_PRETTY_PRINT-Konstante, welche während der Entwicklung sehr hilfreich sein kann, in einer Produktionsumgebung jedoch deaktiviert werden sollte. Mit dieser Option werden zusätzlich Leerzeichen eingefügt, sodass die Lesbarkeit auf der Konsole oder im Browser deutlich gesteigert wird.


Auf den nächsten Seiten erwarten Sie folgende Themen:

  • JSON decodieren in PHP
  • Error-Handling und Testing
  • Fazit
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -