<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 15103 -->
<sect3 id="zend.controller.actionhelpers.json">
    <title>JSON</title>

    <para>
        JSON レスポンスは、AJAX リクエストでデータセットを受け取るときの
        形式としてすっかり定着しました。JSON はクライアント側で
        すぐにパースすることができ、すばやく実行できます。
    </para>

    <para>
        JSON アクションヘッダは次のようなことを行います。
    </para>

    <itemizedlist>
        <listitem><para>
                レイアウト機能が有効になっている場合はそれを無効にする。
        </para></listitem>

        <listitem>
            <para>
                任意で、オプションの配列を
                <classname>Zend_Json::encode()</classname> の 2 番目の引数として渡す。
                このオプションの配列で、レイアウト機能を有効にしたり
                <classname>Zend_Json_Expr</classname> によるエンコードを有効にしたりする。
            </para>

            <programlisting role="php"><![CDATA[
$this->_helper->json($data, array('enableJsonExprFinder' => true));
]]></programlisting>
        </listitem>

        <listitem><para>
                ViewRenderer が有効になっている場合にそれを無効にする。
        </para></listitem>

        <listitem><para>
                'Content-Type' レスポンスヘッダを 'application/json' に設定する。
        </para></listitem>

        <listitem><para>
                デフォルトでレスポンスをすぐに返す。
                アクションの実行が終了するのを待たない。
        </para></listitem>
    </itemizedlist>

    <para>
        使い方は簡単です。ヘルパーブローカのメソッドとしてコールするか、
        <code>encodeJson()</code> あるいは
        <code>sendJson()</code> といったメソッドをコールするだけです。
    </para>

    <programlisting role="php"><![CDATA[
class FooController extends Zend_Controller_Action
{
    public function barAction()
    {
        // 何らかの処理をして...
        // JSON レスポンスを返します
        $this->_helper->json($data);

        // あるいは...
        $this->_helper->json->sendJson($data);

        // あるいは JSON を取得します
        $json = $this->_helper->json->encodeJson($data);
    }
}
]]></programlisting>

    <note>
        <title>レイアウトの維持</title>

        <para>
            JSON レスポンスでレイアウト機能を使用したい場合
            (いくつかの JSON レスポンスをひとつにまとめて処理するなど)
            のために、JSON ヘルパーの各メソッドには
            2 番目の引数が用意されています。
            この引数はオプションのフラグで、レイアウト機能を有効あるいは無効にします。
            <code>true</code> を渡すと、レイアウト機能を有効なままにします。
        </para>

        <programlisting role="php"><![CDATA[
$this->_helper->json($data, true);
]]></programlisting>

        <para>
            オプションで、2 番目の引数に配列を渡すことができます。
            この配列には、<code>keepLayouts</code>
            のオプションを含むさまざまなオプションを指定することができます。
        </para>

        <programlisting role="php"><![CDATA[
$this->_helper->json($data, array('keepLayouts' => true);
]]></programlisting>
    </note>

    <note>
        <title>Zend_Json_Expr を使用したエンコードの有効化</title>

        <para>
            <classname>Zend_Json::encode()</classname> は、ネイティブ JSON 式を
            <classname>Zend_Json_Expr</classname> オブジェクトを使用してエンコードすることができます。
            このオプションはデフォルトでは無効になっています。
            有効にするには、<code>enableJsonExprFinder</code>
            オプションに <code>true</code> を設定します。
        </para>

        <programlisting role="php"><![CDATA[
$this->_helper->json($data, array('enableJsonExprFinder' => true);
]]></programlisting>

        <para>
            これを行いたい場合は、2 番目の引数に必ず配列を渡さなければなりません。
            また、たとえば <code>keepLayouts</code> のような他のオプションと組み合わせることもできます。
            これらすべてのオプションが <classname>Zend_Json::encode()</classname> に渡されます。
        </para>

        <programlisting role="php"><![CDATA[
$this->_helper->json($data, array(
    'enableJsonExprFinder' => true, 
    'keepLayouts'          => true,
));
]]></programlisting>
    </note>
</sect3>
<!--
vim:se ts=4 sw=4 et:
-->
