Google Custom Search API возвращает неверный JSON? - PullRequest
0 голосов
/ 20 октября 2011

Я звоню в Google Custom Search с Node.js, чтобы попробовать. Я получаю результаты обратно очень хорошо, но когда я пытаюсь проанализировать JSON с помощью JSON.parse (dataFromGoogle), я получаю недопустимые ошибки токена для ряда элементов (заголовки html и фрагменты; в заголовках html есть escape-последовательности юникода) , но я не уверен, что не так с фрагментами). Я могу заставить Google не отправлять мне обратно заголовки html, но мне действительно нужны фрагменты!

Есть ли хороший способ обойти это, или я должен просто запланировать некоторую дополнительную предварительную обработку для удаления недопустимых символов вручную?

** Редактировать: добавлен вывод консоли из этого

поиск "малого бизнеса" с помощью Google

{ "kind": "customsearch # search", "URL": { "type": "application / json", "шаблон": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&hr={language?}&safe={safe?}&cx={cx?}&cref={cref?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&alt=json" }, "запросы": { "следущая страница": [ { "title": "Пользовательский поиск Google - малый бизнес", "totalResults": "42300", "searchTerms": "малый бизнес", «считать»: 10, "startIndex": 11, "inputEncoding": "utf8", "outputEncoding": "utf8", «безопасно»: «выключено», "cx": "my_token" } ], "запрос": [ { "title": "Пользовательский поиск Google - малый бизнес", "totalResults": "42300", "searchTerms": "малый бизнес", «считать»: 10, "startIndex": 1, "inputEncoding": "utf8", "outputEncoding": "utf8", «безопасно»: «выключено», "cx": "my_token" } ] }, "контекст": { "title": "IR не определено: 60 "htmlTitle": "\ u003cb \ u003eSmall Business \ u003c / b \ u003e Health Care Tax Cre ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ SyntaxError: неожиданный токен ILLEGAL в Object.parse (родной) на входящем сообщении. (/Users/pvencill/workspace/irslab/lib/searchEngine.js:44:35) на IncomingMessage.emit (events.js: 64: 17) на HTTPParser.onBody (http.js: 119: 42) на CleartextStream.ondata (http.js: 1213: 22) в CleartextStream._push (tls.js: 291: 27) на SecurePair._cycle (tls.js: 565: 20) в EncryptedStream.write (tls.js: 97: 13) в Socket.ondata (stream.js: 40: 26) в Socket.emit (events.js: 64: 17)

1 Ответ

1 голос
/ 26 октября 2011

Ух ты, так получается, что я совершенно не понял, о чем говорила ошибка. То, что это происходило на полях, содержащих юникод, было совпадением. Проблема real заключалась в том, что я вызывал JSON.parse внутри обработчика .on ("data", ...), который обрабатывает часть чанкованного ответа; может быть недействительным терминатором оператора JS до завершения чанка. Правильный способ справиться с этим - построить тело и затем использовать ("конец") для его анализа.

        var message = "";
        https.get(options, function(res){
            res.setEncoding('utf8');
            res.on('data', function(data){
                message += data;
            });

            res.on('end', function(){
                if(callback){
                    var data = JSON.parse(message);
                    data.items = data.items || [];
                    callback(data);
                }
            });

            res.on('error', function(error){
                console.log("ERROR" + error.message);
            });
...