天使漫步IT工作室天使漫步IT工作室

PHP和JAVA如何解析jsonp格式的数据转换为对象

A355C063-FA7B-48C1-86FE-714AB9BD870C.png

一、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的类中解析即可,无需剔除最外层再解析。

本站原创,欢迎转载,转载敬请标明出处:天使漫步IT工作室 » PHP和JAVA如何解析jsonp格式的数据转换为对象
添加新评论