将字符串清理为JSON

时间:2015-04-21 05:48:32

标签: javascript regex json

我是网页抓取,get请求网站会返回如下字符串:

jQuery18305426675335038453_1429531451051({"d":[{"__metadata":"cool"}]})

整个代码在这里:

var baseUrl = "http://SOMEURL.COM?spatialFilter=nearby(52.47952651977539,-1.911009430885315,400)&$select=*&$top=200&$format=json&key=AjF8l9J6TH-WM5tkfFYdYE8NVUx9SFe4ya9aBaxKFFPBImvFWWHPOsRMSBesWblU&jsonp=jQuery18305426675335038453_1429531451051&_=1429532300821%20HTTP/1.1";

var casper = require('casper').create({
    verbose: false,
    logLevel: 'debug',
    pageSettings: {
        loadImages:  false,
        loadPlugins: false
        }
});


var fs = require('fs'),
    shopInfo,
    savePath, 
    date = new Date(),
    secondsNow = date.getSeconds(),
    day = date.getDate(),
    minute = date.getMinutes();
    month = date.getMonth() + 1, 
    fname = 'virginmedia-'+month+'-'+day+'-'+minute+'-'+secondsNow+'.txt';

function saveToFile(finalData) {
    savePath = fs.pathJoin(fs.workingDirectory,
     'output',fname);
    fs.write(savePath, finalData, 'w');

}


casper.start(baseUrl, {
            method: 'get',
            headers: {
            'Accept': 'application/json'
                    }});
casper.then(function getData(){


    var rawData = this.getPageContent();

    shopInfo = rawData;
        shopInfo = shopInfo.replace("jQuery18305426675335038453_1429531451051(",'');
        shopInfo = shopInfo.replace(/\)$/,'');
        shopInfo = JSON.parse(shopInfo);
    var resultPack = shopInfo.d.results;

    var finalData = resultPack.map(function(val){
    return [
              val.Latitude,
              val.Longitude,
              val.EntityStoreName
           ];
    });

    saveToFile(JSON.stringify(finalData)); 
    casper.echo("\n Hello! I just returned " + finalData.length
    + " shops");

});
casper.run();

换句话说,函数调用里面有效的json!但我需要JSON部分。

在浏览器中,我可以轻松地构建一个具有相同名称的函数,该函数返回自己的参数:

function jQuery18305426675335038453_1429531451051() {
  return arguments[0];

}

但是在casperjs它只是不起作用。所以我的最后一个选择是使用正则表达式来获取JSON字符串:

shopInfo = shopInfo.replace("jQuery18305426675335038453_1429531451051(",'');
shopInfo = shopInfo.replace(/\)$/,'');

有没有更好的方法呢?

编辑1: 从评论我发现它实际上是JSONP,而不是JSON,生活变得轻松!我在搜索JSONP之后找到了here的答案。

编辑2: 在评论中找到的另一个解决方案:通过更改请求,网站自行返回正确的JSON!

1 个答案:

答案 0 :(得分:1)

阅读完评论后,答案如下:

  1. 该格式称为JSONP,或带填充的JSON。它在here

  2. 中的SO中进行了讨论
  3. 实际上没有必要这样做,可以更改HTTP请求,以便返回真正的JSON数据。只需从请求中删除此部分:jsonp=jQuery18305426675335038453_1429531451051&_=1429532300821%20HTTP/1.1