PHP:处理“JSONP”输出与“JSON”及其解析?
Posted
技术标签:
【中文标题】PHP:处理“JSONP”输出与“JSON”及其解析?【英文标题】:PHP: Handling 'JSONP' output vs 'JSON', and its parsing? 【发布时间】:2013-07-10 21:23:42 【问题描述】:我在使用 php 的 json_decode
函数解析“jsonp”请求时遇到问题。
我的问题是
一个。 'jsonp' 中的回调函数有什么用,我应该只是将其关闭,还是我想以某种方式使用它。 ?
b. 如何纠正以 '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,这会抛出错误4,意思是JSON_SYNTAX_ERROR,我猜的原因是因为jsonp中的字符串类型的名称没有被引用。例如Categories
、Name
、Position
等
$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"
]
);
【问题讨论】:
查看这个答案:***.com/a/5081588/1788516 @Perry,谢谢我确实看到了这个答案,但是响应服务器发送回调函数有什么原因吗?那个回调函数一定是有目的的吧? 【参考方案1】:'jsonp' 中的回调函数有什么用,我应该只是将其关闭,还是我想以某种方式使用它。 ?
JSON-P 实际上是一个 javascript 脚本,由带有参数的函数调用组成。
如果你想用 PHP 解析它,那么是的,你需要把它去掉。最后还需要去掉);
。
b.如何纠正以 'jsonp' 格式收到的语法错误?
您需要修复数据,使其真正成为 JSON。您拥有的数据是 JavaScript 文字,但它不符合与 JSON 匹配的 JavaScript 子集(例如,属性名称不是字符串,但必须是)。
最好从源中获取真正的 JSON 资源。
【讨论】:
澄清一些事情会尝试并让你知道。【参考方案2】:回调函数用于 JS 调用 - 它允许以 AJAX 方式使用 API,而无需考虑同源策略。 JS中使用JSONP调用时,浏览器只调用API客户端需要定义的回调函数。
当你在 PHP 中使用 JSONP 时,根本不需要回调函数。如果服务器支持原始 JSON 类型调用 - 使用它,如果不剥离回调函数字符串,在你的情况下
$jsonData = json_decode(substr($feed, 22, -2));
【讨论】:
【参考方案3】:不确定,但我认为名称也应该这样引用:
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:也可能是“类别”:?
【讨论】:
我以为响应服务器会处理这个问题,不幸的是它没有。有没有办法用一些php函数来管理它。 嗯...原始数据以字符串形式出现,看起来是错误的,但您可以像编辑任何其他字符串一样对其进行编辑。 (应该有更好的方法来做到这一点)您可以尝试逐行阅读它,在“:”上展开它并将第一个元素设置为带引号并将其重写为另一个字符串,这将是有效的 JSON...跨度> 感谢会尝试作为最后的手段,因为每次用户请求页面时在服务器上处理都是乏味的。以上是关于PHP:处理“JSONP”输出与“JSON”及其解析?的主要内容,如果未能解决你的问题,请参考以下文章