If you want to render everything from a specific controller (in your case, ApiController.php) as JSON without requiring the user to append the .json extension on their request, you can use renderAs and setContent in your beforeFilter.
public function beforeFilter() {
parent::beforeFilter();
$this->RequestHandler->setContent('json');
$this->RequestHandler->renderAs($this, 'json');
}
renderAs and setContent are part of RequestHandler.
This does mean that this controller will never return anything other than json. If your happy with that, you can even remove extension catcher in your routes.php file...
Router::parseExtensions('json');
Remembering that if you remove the above line from your routes.php file, a request to your ApiController of any kind will result in a 404 being thrown (not as JSON).
Developing further using the beforeFilter you can actually render as different content-types depending on the type of request. For example..
public function beforeFilter() {
parent::beforeFilter();
if ($this->RequestHandler->isGet()) {
$this->RequestHandler->setContent('json');
$this->RequestHandler->renderAs($this, 'json');
}
}