Хочу рассказать об одном очень забавном баге, с которым столкнулся. Возможно, более опытные разработчики сейчас скажут «этот баг давно известен» и на меня посыпятся гневные отзывы, но все же, я не нашел упоминаний о нем, когда искал варианты решений. А решил я его абсолютно «безполезной» строкой кода. Кому интересно — добро пожаловать под кат.
В чем, собственно, суть. Разрабатывался проект. Разрабатывался у нас на тестовом сервере и все работало отлично было пару связок передачи данных по AJAX от PHP на фронтенд в виде JSON, который генерировался на стороне сервера через json_encode(). И все было отлично, данные получались, обрабатывались и выводились. До тех пор, пока мы не переехали на релизный сервер. И тут я получаю замечательную ошибку: JSON parse error unexpected sysmbol at line 1, column 1. Первым делом я определяю в каком из AJAX зпросов этот баг вылез. Пациент найден. Добавляем перед
var dataObj = JSON.parse(data);
отладочный вывод:
console.log(data);
И видим, что это вполне валидный JSON:
{"dates":["2014-12-02","2014-12-03","2014-12-04","2014-12-05","2014-12-10","2014-12-11","2014-12-15","2014-12-20","2014-12-21"]}
Скопировав всю строку из вывода в JSON validator и убрав кавычки, вдруг, обнаруживаем один непечатаемый символ. Сразу думаю про кодировку и тд, но все это работает на modX и, если бы кодировка хромала — то, багало-бы все, а не один метод.
Итого, почти уже в агонии я пишу такой код:
var dat = data.substing(0,data.length);
var d = JSON.parse(dat);
Каково-же было мое удивление, когда все заработало отлично. Итого, substring, который не обрезает строку, спасает наш JSON.
В итоге: все работает и заказчик доволен.
К сведению — обработчик ajax для этого кода обрабатывает и другие запросы, и отправляет другие респонсы и только в этом месте он падал. Откуда такое поведение и что конкретно делает substring в данном контексте — я не знаю. Надеюсь, в комментариях будет объяснение этого парадокса.