Не парсирует строку JSON

ghaiklor

Новичок
Привет всем.
Столкнулся с проблемой такого характера. Скриптом генерирую JSON-строку на сервере. Этот скрипт пинаю AJAХ-запросом. Запрос выполняется, в файрбаге вижу ответ от скрипта - эту самую JSON-строку. Эту строку проверяю на валидаторе - все верно сформировалось. Но на ответе AJAX-запроса срабатывает onError с ошибкой "parse error: Syntax Error: JSON parse: bad control character in string literal".
Перегуглил уже кучу страниц, испробовал кучу методов, но все остается таким же.
В чем может быть проблема?

Функция, которая составляет запрос AJAX и парсит данные.
PHP:
function T_addElementsMonitoring() {
    function onLoaded(data)
    {
        data = jQuery.parseJSON(data);
        var monitoring_units_target_tbody = document.getElementById('monitoring_units_target').getElementsByTagName('tbody')[0]; //считываем блок tbody
        T_clearElementsMonitoring(); //очищаем таблицу от данных
        var i = 0;
        while (i < data.length) {
            var tr = document.createElement('TR'); //создаем дочерний элемент для вставки в таблицу
            var T_testString = "/*здесь идет HTML-разметка*/";
            tr.innerHTML = T_testString;
            monitoring_units_target_tbody.appendChild(tr); //добавить чилда в блок tbody
            i++; 
        }    
    }
    
    function onError(xmlHttpRequest, textStatus, errorThrown) {
        if(xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0) {
            return;
        } else {
            ajaxerrmess("Error: " + textStatus + ' ' + errorThrown);
        }
    }
    
    $.ajax({
        type: 'GET',
        data: {
            type: 1
        },
        url: "ajx/db_getData.php",
        dataType: 'json',
        success: onLoaded,
        error: onError,
        cache: false
    })
}
Сам скрипт на сервере, который генерит JSON-строку
PHP:
<?php

session_start();

require ('../inc/config.php');

$user = '';
$pass = '';
$host = '';
$core = '';

$json_string = array();

try {
    mysql_connect($host, $user, $pass);
    @mysql_select_db($core) or die("Can't select database");
} catch (Exception $e) {
    die("Can't connect: " . $e->getMessage());
}

try {
    $query = "SELECT * FROM CarsOnlineData";
    $result = mysql_query($query);
    $num = mysql_num_rows($result);
    mysql_close();

    $i = 0;
    while ($i < $num) {
        $id = mysql_result($result, $i, "id");
        $carId = mysql_result($result, $i, "carID");
        $carLatitude = mysql_result($result, $i, "CarLatitude");
        $carLongitude = mysql_result($result, $i, "CarLongitude");
        $carCourse = mysql_result($result, $i, "CarCourse");
        $carSpeed = mysql_result($result, $i, "CarSpeed");
        $carParkTime = mysql_result($result, $i, "CarParkTime");

        $json_string[$i]['id'] = $id;
        $json_string[$i]['carId'] = $carId;
        $json_string[$i]['carLatitude'] = $carLatitude;
        $json_string[$i]['carLongitude'] = $carLongitude;
        $json_string[$i]['carCourse'] = $carCourse;
        $json_string[$i]['carSpeed'] = $carSpeed;
        $json_string[$i]['carParkTime'] = $carParkTime;

        $i++;
    }
} catch (Exception $e) {
    die("Can't get data: " . $e->getMessage());
}

if (!function_exists('json_encode')) {

    function json_encode($data) {
        switch ($type = gettype($data)) {
            case 'NULL':
                return 'null';
            case 'boolean':
                return ($data ? 'true' : 'false');
            case 'integer':
            case 'double':
            case 'float':
                return $data;
            case 'string':
                return '"' . addslashes($data) . '"';
            case 'object':
                $data = get_object_vars($data);
            case 'array':
                $output_index_count = 0;
                $output_indexed = array();
                $output_associative = array();
                foreach ($data as $key => $value) {
                    $output_indexed[] = json_encode($value);
                    $output_associative[] = json_encode($key) . ':' . json_encode($value);
                    if ($output_index_count !== NULL && $output_index_count++ !== $key) {
                        $output_index_count = NULL;
                    }
                }
                if ($output_index_count !== NULL) {
                    return '[' . implode(',', $output_indexed) . ']';
                } else {
                    return '{' . implode(',', $output_associative) . '}';
                }
            default:
                return ''; // Not supported
        }
    }

}
echo json_encode($json_string);
?>
 

Redjik

Джедай-мастер
Столько много букв - вообще до лампочки где и как у тебя что генерит. Строку сгенеренную покажи.
 

ghaiklor

Новичок
[{"id":"1","carId":"82413","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"2","carId":"82415","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"3","carId":"82417","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"4","carId":"51588","carLatitude":"55.709292","carLongitude":"28.1919826666667","carCourse":"3.14159265358979","carSpeed":"0","carParkTime":" 1:00:12 "},{"id":"5","carId":"51605","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"6","carId":"51619","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"7","carId":"51629","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"8","carId":"51632","carLatitude":"55.766116","carLongitude":"27.942236","carCourse":"3.14159265358979","carSpeed":"0","carParkTime":" 1:00:59 "},{"id":"9","carId":"71173","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"10","carId":"71174","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"11","carId":"108474","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"12","carId":"108475","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"13","carId":"112342","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"14","carId":"49667","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"15","carId":"81209","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"16","carId":"51630","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"17","carId":"47515","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"18","carId":"51586","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"19","carId":"51606","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"20","carId":"51608","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"21","carId":"51610","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"22","carId":"51634","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"23","carId":"74591","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"24","carId":"74593","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"25","carId":"74596","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "},{"id":"26","carId":"74600","carLatitude":"-777","carLongitude":"-777","carCourse":"0","carSpeed":"0","carParkTime":" 0:00:00 "}]
 

ghaiklor

Новичок
Firefox
Заголовки ответа
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection Keep-Alive
Content-Length 3432
Content-Type text/html; charset=windows-1251
Date Sun, 03 Jun 2012 16:22:34 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive timeout=5, max=90
Pragma no-cache
Server Apache/2.2.3 (Win32) DAV/2 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_autoindex_color PHP/5.1.6
X-Powered-By PHP/5.1.6

Заголовки запроса
Accept application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Connection keep-alive
Cookie PHPSESSID=35989c25da9ce4eb79d6f801176361e1
Host localhost
Referer http://localhost/
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
X-Requested-With XMLHttpRequest
 

Redjik

Джедай-мастер
ну вероятно вот это причина Content-Type text/html; charset=windows-1251, ибо ajax любит только utf-8
 

ghaiklor

Новичок
Каким образом можно задать UTF-8?
Нужно запрос к самой БД делать с отображением в этой кодировке?
 

Redjik

Джедай-мастер
Я хз, что у тебя там за движок cms и где в нем настраивается кодировка, но вообще можно в .htaccess задать дефолтовую, или в скрипте на вывод твоей строки обозначить header с кодировкой в utf
 

ghaiklor

Новичок
У меня не движок. Я с нуля пишу.
Попробую сейчас в скрипте задать.
 

ghaiklor

Новичок
Добавил в скрипт
PHP:
header("Content-type: text/html; charset=utf-8");
.
Ничего не изменилось, все та же ошибка. Добавил в самое начало скрипта после открывающего тега.
 

ghaiklor

Новичок
Посылаю перед выборкой текста запрос в БД
PHP:
mysql_query('SET NAMES UTF8;');
И этот ход не катит.
 

Redjik

Джедай-мастер
ну в скрипте задал а в загаловках то поменялась кодировка?
 

ghaiklor

Новичок
Да, поменялось:
Заголовки ответа
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection Keep-Alive
Content-Length 3432
Content-Type text/html; charset=utf-8
Date Sun, 03 Jun 2012 19:40:20 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive timeout=5, max=73
Pragma no-cache
Server Apache/2.2.3 (Win32) DAV/2 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_autoindex_color PHP/5.1.6
X-Powered-By PHP/5.1.6

Заголовки запроса
Accept application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Connection keep-alive
Cookie PHPSESSID=35989c25da9ce4eb79d6f801176361e1
Host localhost
Referer http://localhost/
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
X-Requested-With XMLHttpRequest
 

Sufir

Я не волшебник, я только учусь
Ну, ещё, правильнее отдавать json с заголовком: Content-Type: application/json, а не Content-Type text/html.
И для jQ.ajax() попробуй указать параметр dataType: "json".

А ajax, хоть и "любит только utf-8", но cp1251 вполне себе жуёт - проверено (по безвыходности).
 

ghaiklor

Новичок
Я уже разобрался с багом.
Проблема была с инфой в БД.
Каким-то непонятным образом перед значением одним добавляло символ перевода строки.
Он эту строку считывал и переводил на новый рядок в ЖСОН, тем самым делая неправильный формат.
А валидаторы при проверке этот ентер спокойно себе убирали, поэтому и не сказало что неправильный формат.
Вот так-вот :)
 

ghaiklor

Новичок
Каким образом можно убрать все ненужные символы?
rtrim не работает, html_special_chars тоже не с этого разряда. Именно символ перевода строки во всей строке нужно убрать.
 

Redjik

Джедай-мастер
Ragazzo
если мне память не изменяет - trim по дефолту обрезат все переводы строк и пробелы

upd. Проверился

Эта функция возвращает строку str с удаленными из начала и конца строки пробелами. Если второй параметр не передан, trim() удаляет следующие символы:

" " (ASCII 32 (0x20)), обычный пробел.
"\t" (ASCII 9 (0x09)), символ табуляции.
"\n" (ASCII 10 (0x0A)), символ перевода строки.
"\r" (ASCII 13 (0x0D)), символ возврата каретки.
"\0" (ASCII 0 (0x00)), NUL-байт.
"\x0B" (ASCII 11 (0x0B)), вертикальная табуляция.
 

Ragazzo

TDD interested
Иван Redjik Матвеев
Ну да, все верно. просто фраза
rtrim не работает, html_special_chars тоже не с этого разряда. Именно символ перевода строки во всей строке нужно убрать.
настолько неодназначна, что непонятно что ему нужно сделать, поэтому уж str_replace точно подойдет если что :)
 
Сверху