How to return JSONP from a menu callback
The array was being double encoded. First by the $json_response = drupal_json_encode($response); and then again by the menu delivery callback 'delivery callback' =&gt; 'drupal_json_output'.

To fix this, remove the delivery callback, and use just 'type' =&gt; MENU_CALLBACK,.

In the function change this:

if (isset($callback) &amp;&amp; $callback != '') {
  $json_response = drupal_json_encode($response);
  echo $callback ."(". $json_response .");";
}


to this:

if (isset($callback) &amp;&amp; $callback != '') {
  $json_response = drupal_json_encode($response);
  drupal_add_http_header('Content-Type', 'application/javascript');
  echo $callback . "(" . $json_response . ");";
  drupal_exit();
}