[MANUAL] German:
[zend.git] / documentation / manual / de / module_specs / Zend_Json-Objects.xml
blob10673658947b817c5de18689ed821e58cb523314
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21740 -->
3 <!-- Reviewed: no -->
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>
10         <para>
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
13             kodiert.
14         </para>
16         <para>
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.
23         </para>
25         <para>
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.
32         </para>
34         <para>
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:
38         </para>
40         <programlisting language="php"><![CDATA[
41 // Dekodiere JSON Objekte als PHP Objekte
42 $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
43 ]]></programlisting>
45         <para>
46             Jedes dekodierte Objekte wird als <code>StdClass</code> Objekt mit Eigenschaften
47             entsprechend der Schlüssel/Wert Paare der <acronym>JSON</acronym> Notation
48             zuürckgegeben.
49         </para>
51         <para>
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>
56             bestückt werden.
57         </para>
58     </sect2>
60     <sect2 id="zend.json.advanced.objects2">
61         <title>Kodierung von PHP Objekten</title>
63         <para>
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.
69         </para>
70     </sect2>
72     <sect2 id="zend.json.advanced.internal">
73         <title>Interner Encoder/Decoder</title>
75         <para>
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.
84         </para>
86         <para>
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:
89         </para>
91         <programlisting language="php"><![CDATA[
92 Zend_Json::$useBuiltinEncoderDecoder = true:
93 ]]></programlisting>
94     </sect2>
96     <sect2 id="zend.json.advanced.expr">
97         <title>JSON Ausdrücke</title>
99         <para>
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.
107         </para>
109         <para>
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:
118         </para>
120         <programlisting language="php"><![CDATA[
121 $data = array(
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(
128     $data,
129     false,
130     array('enableJsonExprFinder' => true)
132 ]]></programlisting>
133     </sect2>
134 </sect1>