Небольшой костыль позволил уменьшить размер JSON с 379 до 146 кб, т.е. больше чем в 2 раза.
Если кто-то подскажет как сделать правильно буду рад:
class ServicesJSONFormatter implements ServicesFormatterInterface {
public function render($data) {
function php2js($a = false) {
if (is_null($a) || is_resource($a)) {
return 'null';
}
if ($a === false) {
return 'false';
}
if ($a === true) {
return 'true';
}
if (is_scalar($a)) {
if (is_float($a)) {
$a = str_replace(',', '.', strval($a));
}
static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '', '\\t', '', '\\b', '\\f', '\"'));
return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
}
$isList = true;
for ($i = 0, reset($a); $i < count($a); $i++, next($a)) {
if (key($a) !== $i) {
$isList = false;
break;
}
}
$result = array();
if ($isList) {
foreach ($a as $v) {
$result[] = php2js($v);
}
return '[ ' . join(', ', $result) . ' ]';
} else {
foreach ($a as $k => $v) {
$result[] = php2js($k) . ': ' . php2js($v);
}
return '{ ' . join(', ', $result) . ' }';
}
}
// json_encode doesn't give valid json with data that isn't an array/object.
if (is_scalar($data)) {
$data = array($data);
}
return str_replace('\\/', '/', php2js($data));
}
}
sites/all/modules/services/servers/rest_server/includes/ServicesFormatter.inc