Задать вопрос
UksusoFF
@UksusoFF

Как настроить Drupal Services для нормального вывод русского текста в JSON?

Добрый день,

Есть Drupal 7 с настроенным Services.
С помощью Services Views формируется JSON.
Во время предпросмотра во Views русский текст отображается корректно.
А вот когда пытаешься через endpoint получить JSON, то русский текст кодируется в:
\u0418\u0432\u0430\u043d \u0422\u0443\u0440\u0438\u0441\u0442


Спасибо.
  • Вопрос задан
  • 3004 просмотра
Подписаться 2 Оценить 3 комментария
Решения вопроса 1
UksusoFF
@UksusoFF Автор вопроса
Небольшой костыль позволил уменьшить размер 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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы