# JSON

JSON responses are rapidly becoming the response of choice when dealing with AJAX requests that expect dataset responses; JSON can be immediately parsed on the client-side, leading to quick execution.

## Usage

Usage is simple: either call it as a method of the helper broker, or call one of the methods `encodeJson()` or `sendJson()`:

direct($data, $sendNow = true, $keepLayouts = false, $encodeData = true)

sendJson($data, $keepLayouts = false, $encodeData = true)

encodeJson($data, $keepLayouts = false, $encodeData = true)

- $data: data to encode as JSON

- $sendNow: flag to define whether to send the JSON data immediately. When true, the helper will immediately set the respose body and exit.

- $keepLayouts: flag to define whether to enable or disable layours. When false, all layouts are disabled. Optionally, this can be an array of options to pass as the second argument to `Zend_Json::encode()`. This array of options allows enabling layouts and encoding using `Zend_Json_Expr`.

- $encodeData: flag to define whether $data is already JSON-encoded. When true, this helper will not encode $data to JSON before sending.

### Keeping Layouts

If you have a separate layout for JSON responses -- perhaps to wrap the JSON response in some sort of context -- each method in the JSON helper accepts an optional argument $keepLayouts: a flag to enable or disable layouts. Passing a boolean `TRUE` value will keep layouts enabled:

    $this->_helper->json($data, true);

Optionally, you can pass an array as the third parameter. This array may contain a variety of options, including the keepLayouts option:

    // Direct helper call
    $this->_helper->json($data, true, array('keepLayouts' => true);

    // ...or, call a method of the helper
    $this->_helper->sendJson($data, array('keepLayouts' => true));

### Enabling encoding using Zend_Json_Expr

`Zend_Json::encode()` allows the encoding of native JSON expressions using `Zend_Json_Expr` objects. This option is disabled by default. To enable this option, pass a boolean `TRUE` value to the enableJsonExprFinder option:

    $this->_helper->json($data, true, array('enableJsonExprFinder' => true);

If you desire to do this, you must pass an array as the third argument. This also allows you to combine other options, such as the keepLayouts option. All such options are then passed to `Zend_Json::encode()`.

    $this->_helper->json($data, true, array(
    'enableJsonExprFinder' => true,
    'keepLayouts'          => true,
    ));

## Example

    class FooController extends Zend_Controller_Action
    {
        public function barAction()
        {
            // do some processing...
            // Send the JSON response:
            $this->_helper->json($data);

            // or...
            $this->_helper->json->sendJson($data);

            // or retrieve the json:
            $json = $this->_helper->json->encodeJson($data);
        }
    }