<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.json.advanced">
    <title>Uso Avançado do Zend_Json</title>

    <sect2 id="zend.json.advanced.objects1">
        <title>Objetos JSON</title>

        <para>
            Quando codificamos objetos <acronym>PHP</acronym> como <acronym>JSON</acronym>, todas
            as propriedades públicas desse objeto estarão codificadas em um objeto
            <acronym>JSON</acronym>.
        </para>

        <para>
            <acronym>JSON</acronym> não permite referências de objeto, por isso deve-se tomar
            cuidado para não codificar objetos com referências recursivas. Se você tiver problemas
            com a recursividade, <methodname>Zend_Json::encode()</methodname> e
            <methodname>Zend_Json_Encoder::encode()</methodname> permitem um segundo parâmetro
            opcional para verificar a recursividade; se um objeto for serializado duplamente,
            uma exceção será lançada.
        </para>

        <para>
            Descodificar objetos <acronym>JSON</acronym> traz uma ligeira dificuldade, entretanto,
            desde que os objetos do JavaScript correspondam o mais próximo de uma matriz
            associativa do <acronym>PHP</acronym>. Alguns sugerem que um identificador da classe
            deve ser passado, e um exemplo do objeto dessa classe deve ser criado e populado com
            os pares chave/valor do objeto <acronym>JSON</acronym>; outros pensam que isto poderia
            gerar um risco substancial da segurança.
        </para>

        <para>
            Por padrão, <classname>Zend_Json</classname> irá descodificar objetos
            <acronym>JSON</acronym> como matriz associativas. Entretanto, se você deseja que o
            retorne um objeto, você pode especificar isto:
        </para>

        <programlisting language="php"><![CDATA[
// Descodifique objetos JSON como objetos PHP
$phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
]]></programlisting>

        <para>
            Todos os objetos descodificados assim são retornados como objetos de
            <classname>StdClass</classname> com as propriedades que correspondem aos pares
            chave/valor na notação de <acronym>JSON</acronym>.
        </para>

        <para>
            A recomendação do Zend Framework é que o desenvolvedor deve decidir-se como
            descodificar objetos <acronym>JSON</acronym>. Se um objeto de um tipo especificado for
            criado, pode ser criado no código do desenvolvedor e ser populado com os valores
            descodificados usando <classname>Zend_Json</classname>.
        </para>
    </sect2>

    <sect2 id="zend.json.advanced.objects2">
        <title>Codificando Objetos PHP</title>

        <para>
            Se você estiver codificando objetos <acronym>PHP</acronym> por padrão, o mecanismo de
            codificação só poderá acessar as propriedades públicas desses objetos. Quando o método
            <methodname>toJson()</methodname> é implementado em um objeto para codificar,
            <classname>Zend_Json</classname> chama esse método e espera que o objeto retorne uma
            representação <acronym>JSON</acronym> de seu estado interno.
        </para>
    </sect2>

    <sect2 id="zend.json.advanced.internal">
        <title>Codificador/Descodificador Interno</title>

        <para>
            <classname>Zend_Json</classname> tem dois modos diferentes, dependendo se ext/json
            está habilitado em sua instalação do <acronym>PHP</acronym> ou não. Se estiver
            instalado por padrão, <methodname>json_encode()</methodname> e
            <methodname>json_decode()</methodname> são utilizados para a codificação e
            descodificação <acronym>JSON</acronym>. Se não estiver instalado, uma implementação do
            Zend Framework no código <acronym>PHP</acronym> é usada para a codificação e
            descodificação. Este último é consideravelmente mais lento do que usando a extensão
            do <acronym>PHP</acronym>, mas comporta-se exatamente da mesma forma.
        </para>

        <para>
            Entretanto, você talvez queira usar o codificador/descodificador interno mesmo tendo o
            ext/json instalado. Você pode conseguir isso chamando:
        </para>

        <programlisting language="php"><![CDATA[
Zend_Json::$useBuiltinEncoderDecoder = true:
]]></programlisting>
    </sect2>

    <sect2 id="zend.json.advanced.expr">
        <title>Expressões do JSON</title>

        <para>
            Javascript faz uso pesado de funções de callback anônimas, que podem ser guardadas
            dentro de variáveis de objeto <acronym>JSON</acronym>. Mesmo assim elas só
            funcionam se não forem devolvidas dentro aspas duplas, que
            <classname>Zend_Json</classname> naturalmente faz. Com o suporte à Expressão no
            <classname>Zend_Json</classname>, você pode codificar objetos <acronym>JSON</acronym>
            com callbacks de javascript válidos. Isso funciona tanto para
            <methodname>json_encode()</methodname> quanto para o codificador interno.
        </para>

        <para>
            Um callback javascript é representado usando o objeto
            <classname>Zend_Json_Expr</classname>. Ela implementa o padrão value object e é
            imutável. Você pode definir a expressão javascript como o primeiro argumento do
            construtor. Por padrão <classname>Zend_Json::encode</classname> não codifica callbacks
            de javascript, você deverá passar a opção <property>enableJsonExprFinder</property> e
            defini-la para <constant>TRUE</constant> para a função
            <methodname>encode()</methodname>. Se ativado, o suporte à expressão funcionará para
            todas as expressões aninhadas em estruturas de grande porte. Um exemplo de uso seria
            parecido com:
        </para>

        <programlisting language="php"><![CDATA[
$data = array(
    'onClick' => new Zend_Json_Expr('function() {'
              . 'alert("I am a valid javascript callback '
              . 'created by Zend_Json"); }'),
    'other' => 'no expression',
);
$jsonObjectWithExpression = Zend_Json::encode(
    $data,
    false,
    array('enableJsonExprFinder' => true)
);
]]></programlisting>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
