6

我在使用 phpjson_decode函数解析“jsonp”请求时遇到问题。

我的问题是

一个。'jsonp'中的回调函数有什么用,我应该把它关掉,还是我想以某种方式使用它。?

湾。如何纠正以“jsonp”格式收到的语法错误?

下面我给出了代码和我得到的响应。

1.我请求一个带有 PHP curl 的示例 url

$url = 'https://ssl.domain.com/data/4564/d.jsonp';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);                
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);        
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");     
$feed = curl_exec($ch);
curl_close($ch);

echo $feed =  gzdecode($feed); // Success its displays the jsonp feed

2.然后我尝试对接收到的输出进行 json_decode,这会抛出错误 no 4,意思是JSON_SYNTAX_ERROR,我猜的原因是因为 jsonp 中的字符串类型的名称没有被引用。例如Categories,NamePosition

$json_feed = json_decode($feed);
$error = json_last_error(); 
echo $error;     // Throws error no. 4

3.来自 url 的 RAW 'jsonp' 输出。

domain_jsonp_callback({
   Categories:[
      {
         Name:"Artifacts",
         Position:14,
         Count:70,
         ImageUrls:{
            i100:"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png",
            i120:"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png",
            i140:"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png",
            i180:"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png",
            i220:"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png",
            i280:"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png"
         }
      }
   ]
});
4

3 回答 3

2

回调函数用于 JS 调用 - 它允许以 AJAX 方式使用 API,而无需考虑同源策略。在 JS 中使用 JSONP 调用时,浏览器只调用API 客户端需要定义的回调函数。

当您在 PHP 中使用 JSONP 时,根本不需要回调函数。如果服务器支持原始 JSON 类型调用 - 使用它,如果不剥离回调函数字符串,在你的情况下

$jsonData = json_decode(substr($feed, 22, -2));
于 2013-07-12T10:53:51.860 回答
2

'jsonp'中的回调函数有什么用,我应该把它关掉,还是我想以某种方式使用它。?

JSON-P 实际上是一个 JavaScript 脚本,由带有参数的函数调用组成。

如果你想用 PHP 解析它,那么是的,你需要把它去掉。您还需要在最后剥离);

湾。如何纠正以“jsonp”格式收到的语法错误?

您需要修复数据,因此它确实是 JSON。您拥有的数据是 JavaScript 文字,但它不符合与 JSON 匹配的 JavaScript 子集(例如,属性名称不是字符串,但必须是)。

最好从源中获取真正的 JSON 资源。

于 2013-07-12T10:54:19.690 回答
1

不确定,但我认为名称也应该这样引用:

domain_jsonp_callback({
   Categories:[
      {
         "Name":"Artifacts",
         "Position":14,
         "Count":70,
         "ImageUrls":{
            "i100":"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png",
            "i120":"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png",
            "i140":"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png",
            "i180":"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png",
            "i220":"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png",
            "i280":"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png"
         }
      }
   ]
});

PS:也可能是“类别”:?

于 2013-07-12T10:48:40.630 回答