javascript - 将字符串清理为 JSON

标签 javascript regex json

我正在进行网页抓取,并且网站在获取请求时返回如下字符串:

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,生活变得轻松!我从here找到了我的答案在搜索 JSONP 后。

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

最佳答案

阅读评论后,答案如下:

  1. 该格式称为 JSONP,或带填充的 JSON。它在 here 中的 SO 中进行了讨论

  2. 实际上没有必要这样做,可以更改 HTTP 请求以使其返回真实的 JSON 数据。只需从请求中删除这部分即可:jsonp=jQuery18305426675335038453_1429531451051&_=1429532300821%20HTTP/1.1

关于javascript - 将字符串清理为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29763922/

相关文章:

用于提取价格信息的 Java Regex

c# - 如何在不使用 JSON.Net 库创建自定义类的情况下从字符串创建 JSON

java - 使用 Struts 将 java bean 转换为 json 字符串

javascript - 如何使用 Javascript 将 HTML/CSS 转换为 PDF?

javascript - 如何从 javascript 变量中隐藏最后一个表的列?

javascript - 如何在vue模板中定义变量?

python - 使用正则表达式从 python 中的文本中仅提取百分比信息

javascript - 单击标记时尝试导航到另一个屏幕

objective-c - 在大型 NSString 中有效地找到许多关键字中的第一个

json - JQ根据键组合json映射数组