一、Jsonp数据
- JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
- 用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
在百度百科对Jsonp的定义中摘取了两行关键句来解读Jsonp。
- 其一:第一句可以理解为,Jsonp和Json是存在关系,而且从它的英文名字(
JSON with Padding
)也可以了解一二:Jsonp就是Json数据外面包了一层壳。 - 其二:第二句话则直接的指出Jsonp就是JavaScript脚本代码,可以直接执行。
但是今天这篇文章聊的并不是怎么使用Jsonp,而是非JavaScript场景中拿到Jsonp格式的东西
,如何解析出Json数据。
二、暴力法去掉Padding
- Jsonp的外面往往包含
try-catch
和callback加括号的形式,只要把外层的包装去掉即可得到Json数据。
Java代码如下:
public class JSONPParser {
public static Map parseJSONP(String jsonp){
int startIndex = jsonp.indexOf("(");
int endIndex = jsonp.lastIndexOf(")");
String json = jsonp.substring(startIndex+1, endIndex);
System.out.println(json);
return JSON.parseObject(json);
}
public static void main(String[] args){
Map map = parseJSONP("jsonp_test({})");
}
}
PHP代码如下:
function jsonp_decode($jsonp, $assoc = false) {
if($jsonp[0] !== '[' && $jsonp[0] !== '{') {
$jsonp = substr($jsonp, strpos($jsonp, '('));
}
return json_decode(trim($jsonp,'();'), $assoc);
}
以上可以看出,第一步都是匹配Jsonp的外层包装,然后利用字符串替换的方式把外层置空从而得到json数据,再使用各语言提供的Json api对数据进行解析。
三、利用API
非常抱歉,PHP并没有API,JAVA是有的。其实就是把Jsonp丢进JsonObject的类中解析即可,无需剔除最外层再解析。