Google Custom Search API返回无效的JSON?

时间:2011-10-20 17:46:48

标签: node.js google-search-api

我正在调用带有Node.js的Google自定义搜索来尝试。我得到的结果很好,但是当我尝试使用JSON.parse(dataFromGoogle)解析JSON时,我在许多元素上获得了非法令牌错误(html标题和片段; html标题中包含unicode转义序列,但我不确定片段有什么问题)。我可以让Google不要将html标题发回给我,但我真的需要这些片段!

是否有一个很好的解决方法,或者我是否应该计划进行一些额外的预处理以手动删除非法字符?

* * 编辑:从此

添加控制台输出

使用Google搜索“小型企业”

  

{    “kind”:“customsearch #search”,    “url”:{     “type”:“application / json”,     “模板”:“https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&hr={language?}&安全= {安全?}&安培; CX = {CX 3}&安培; CREF = {CREF?}&安培;排序= {排序?}&安培;过滤器= {滤波器?}&安培; GL = {GL?}&安培; CR = {CR 1}&安培; googlehost = {googleHost?}&安培; ALT = JSON”    },    “查询”:{     “下一页”: [      {       “标题”:“Google自定义搜索 - 小型企业”,       “totalResults”:“42300”,       “searchTerms”:“小企业”,       “数”:10,       “startIndex”:11,       “inputEncoding”:“utf8”,       “outputEncoding”:“utf8”,       “安全”:“关闭”,       “cx”:“my_token”      }     ]     “请求”:[      {       “标题”:“Google自定义搜索 - 小型企业”,       “totalResults”:“42300”,       “searchTerms”:“小企业”,       “数”:10,       “startIndex”:1,       “inputEncoding”:“utf8”,       “outputEncoding”:“utf8”,       “安全”:“关闭”,       “cx”:“my_token”      }     ]    },    “上下文”:{     “标题”:“IR   未定义:60      “htmlTitle”:“\ u003cb \ u003eSmall Business \ u003c / b \ u003e Health Care Tax Cre                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^   SyntaxError:意外的标记ILLEGAL       at Object.parse(native)       在IncomingMessage。 (/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 个答案:

答案 0 :(得分:1)

哇,所以事实证明我完全误解了错误告诉我的内容。在包含unicode的字段上发生这一事实是巧合。 真正的问题是我在.on(“data”,...)处理程序中调用JSON.parse,它处理了chunked响应的一部分;在块完成之前,可能不是有效的JS语句终止符。处理它的正确方法是构建主体,然后使用on(“end”)来解析它。

        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);
            });