1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21740 -->
4 <sect1 id="zend.json.advanced">
5 <title>Fortgeschrittene Verwendung von Zend_Json</title>
7 <sect2 id="zend.json.advanced.objects1">
8 <title>JSON Objekte</title>
11 Bei der Kodierung von <acronym>PHP</acronym> Objekten nach <acronym>JSON</acronym>
12 werden alle öffentlichen Eigenschaften dieses Objektes im <acronym>JSON</acronym> Objekt
17 <acronym>JSON</acronym> erlaubt keine Objektreferenzen, deshalb sollte dafür Sorge
18 getragen werden, dass keine Objekte mit rekursiver Referenz kodiert werden. Wenn man
19 Probleme mit Rekursion hat, erlauben <methodname>Zend_Json::encode()</methodname> und
20 <methodname>Zend_Json_Encoder::encode()</methodname> die Angabe eines optionalen,
21 zweiten Parameters, um auf Rekursion zu prüfen; wenn ein Objekt doppelt serialisiert
22 wird, wird eine Ausnahme geworfen.
26 Das Dekodieren von <acronym>JSON</acronym> Objekten stellt eine weitere Schwierigkeit
27 dar, allerdings entsprechen Javascript Objekte sehr einem assoziativen Array in
28 <acronym>PHP</acronym>. Einige schlagen vor, dass ein Klassenbezeichner übergeben werden
29 soll und eine Objektinstanz dieser Klasse erstellt und mit den Schlüssel/Wert Paaren des
30 <acronym>JSON</acronym> Objektes bestückt werden soll; andere denken, dies könnte ein
31 erhebliches Sicherheitsrisiko darstellen.
35 Standardmäßig wird <classname>Zend_Json</classname> die <acronym>JSON</acronym> Objekte
36 als assoziative Arrays dekodieren. Wenn du allerdings wünscht, dass ein Objekt zurück
37 gegeben wird, kannst du dies angeben:
40 <programlisting language="php"><![CDATA[
41 // Dekodiere JSON Objekte als PHP Objekte
42 $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
46 Jedes dekodierte Objekte wird als <code>StdClass</code> Objekt mit Eigenschaften
47 entsprechend der Schlüssel/Wert Paare der <acronym>JSON</acronym> Notation
52 Die Empfehlung des Zend Framework ist, dass der einzelne Entwickler selber entscheiden
53 sollte, wie er <acronym>JSON</acronym> Objekte dekodiert. Wenn ein Objekt eines
54 bestimmten Typs erstellt werden soll, kann es im Code des Entwicklers erstellt werden
55 und mit den dekodierten Werten unter Verwendung von <classname>Zend_Json</classname>
60 <sect2 id="zend.json.advanced.objects2">
61 <title>Kodierung von PHP Objekten</title>
64 Wenn man <acronym>PHP</acronym> Objekte kodiert, kann der Kodierungsmechanismus
65 standardmäßig nur auf public Eigenschaften dieser Objekte zugreifen. Wenn eine Methode
66 <methodname>toJson()</methodname> an einem Objekte für die Kodierung implementiert ist,
67 ruft <classname>Zend_Json</classname> diese Methode auf und erwartet dass das Objekt
68 eine <acronym>JSON</acronym> Repräsentation seines internen Status zurückgibt.
72 <sect2 id="zend.json.advanced.internal">
73 <title>Interner Encoder/Decoder</title>
76 <classname>Zend_Json</classname> hat zwei unterschiedliche Modi abhängig davon ob
77 ext/json in der <acronym>PHP</acronym> Installation aktiviert ist oder nicht. Wenn
78 ext/json installiert ist, werden standardmäßig die Funktionen
79 <methodname>json_encode()</methodname> und <methodname>json_decode()</methodname> für
80 die Kodierung und Dekodierung von <acronym>JSON</acronym> verwendet. Wenn ext/json nicht
81 installiert ist wird eine Implentierung vom Zend Framework in <acronym>PHP</acronym>
82 Code für die De-/Kodierung verwendet. Das ist naturgemäß langsamer als die Verwendung
83 der <acronym>PHP</acronym> Erweiterung, verhält sich aber identisch.
87 Machmal will man trotzdem den internen De-/Kodierer verwenden, selbst wenn man ext/json
88 installiert hat. Man kann das durch folgenden Aufruf erzwingen:
91 <programlisting language="php"><![CDATA[
92 Zend_Json::$useBuiltinEncoderDecoder = true:
96 <sect2 id="zend.json.advanced.expr">
97 <title>JSON Ausdrücke</title>
100 Javascript macht häufige Verwendung von anonymen Funktions-Callbacks, welche in
101 <acronym>JSON</acronym> Objektvariablen gespeichert werden können. Trotzdem
102 funktionieren Sie nur wenn Sie nicht in doppelten Anführungszeichen gesetzt werden, was
103 <classname>Zend_Json</classname> natürlich macht. Mit der Unterstützung von Ausdrücken
104 für <classname>Zend_Json</classname> können <acronym>JSON</acronym> Objekte mit gültigen
105 Javascript Callbacks kodiert werden. Das funktioniert sowohl für
106 <methodname>json_encode()</methodname> als auch den internen Kodierer.
110 Ein Javascript Callback wird repräsentiert indem das
111 <classname>Zend_Json_Expr</classname> Objekt verwendet wird. Es implementiert das
112 Wert-Objekt Pattern und ist nicht änderbar. Man kann den Javascript Ausdruck als erstes
113 Argument des Konstruktors setzen. Standardmäßig kodiert
114 <classname>Zend_Json::encode</classname> keine Javascript Callbacks, wenn man die Option
115 <code>'enableJsonExprFinder' = true</code> in der <code>encode</code> Funktion übergibt.
116 Aktiviert, unterstützt arbeiten Ausdrücke für alle enthaltenen Ausdrücke in großen
117 Objektstrukturen. Ein Verwendungsbeispiel würde wie folgt aussehen:
120 <programlisting language="php"><![CDATA[
122 'onClick' => new Zend_Json_Expr('function() { '
123 . 'alert("Ich bin ein gültiger Javascript Callback '
124 . 'erstellt von Zend_Json"); }'),
125 'other' => 'no expression',
127 $jsonObjectWithExpression = Zend_Json::encode(
130 array('enableJsonExprFinder' => true)