jsonp -> json_decode()
Posted
技术标签:
【中文标题】jsonp -> json_decode()【英文标题】: 【发布时间】:2011-01-07 06:18:39 【问题描述】:由于某种原因,我无法从返回的 jsonp 字符串中获取信息,
<?php
// Created by Talisman 01/2010 ★✩
$vorto = $_GET['vorto']; // Get the Word from Outer Space and Search for it!
if (isset($vorto))
echo $vorto;
else
$Help = "No Vorto -> add ?vorto=TheWordYouWant to the end of this website";
echo $Help;
// Now Lets Search Alex's Vortaro, It uses jsonp
// ex. http://vortaro.us.to/ajax/epo/eng/petas/?callback=?
// Future Feature inproved language functinality
$AVurl1 = "http://vortaro.us.to/ajax/epo/eng/";
$AVurl2 = "/?callback=";
$AVfinalurl= $AVurl1 . $vorto . $AVurl2;
echo $AVfinalurl . ' </br> '; // DEBUG CODE
$AVcontent = file_get_contents($AVfinalurl) ;
echo $AVcontent . ' </br> '; // DEBUG CODE
// ★✩ 为什么下一行不起作用?
$AVDecode = json_decode($AVcontent);
// /*
if(isset( $AVcontent)) // DEBUG CODE
echo "json_decode set AVcontent" . ' </br> ';
else
echo "something fishy here" . ' </br> ';
if (empty($AVcontent))
echo "EMPTY EMPTY" . ' </br> ';
else
echo "Not Empty". ' </br> ';
echo $AVDecode . ' </br> ';
// */
// Why can't I echo or access information with $AVDecode? Is it something with
// jsonp?
?>
这是我的结果
komputilojhttp://vortaro.us.to/ajax/epo/eng/komputiloj/?callback=
("text":"komputilo: 计算机")
json_decode 设置AV内容
非空
我应该看到 echo $AVDecode
【问题讨论】:
【参考方案1】:调试建议:
检查json_last_error() 的输出。它应该给你一个它不起作用的确切原因。不过,仅适用于 PHP 5.3.0。
原因:
JSONP 与 JSON 不同。它包含破坏 json_decode() 的额外数据。
解决方案:
使用substr($AVDecode, 1, strlen($AVDecode)-2)
删除多余的括号
【讨论】:
我收到了这个致命错误:使用 echo json_last_error() 在第 53 行调用 /Users/briancarpenter/Sites/Vortoj/preniVortoj.php 中未定义的函数 json_last_error() 解码: ("text":"peti: ask, ask for, beg, bid, request") 对我有用如果我删除周围括号()
。 json_decode 无法处理 jsonp。您需要手动删除括号,或者(更好)使您的数据源输出正确的 json。
+1。 JSONP 是带有函数包装器的 JSON。您可以使用 substr 函数删除函数包装器,然后评估剩余的 JSON 语句。
或者按照 Andy E 的建议使用 substr()。在这种情况下很好。
@Pekka웃 de_DE/German,但我刚刚重新阅读,发现我误读了那个 facepalm ...PHP 5 >= 5.3.0
.【参考方案2】:
您不能回显对象或数组。 请告诉我们这一行打印出来的内容:
print_r(json_decode($AVcontent));
把它放在$AVDecode = json_decode($AVcontent);
之后
【讨论】:
绝对没有任何反应,没有变化 print_r(json_decode($AVcontent));什么都不做, 可能是 ("text":"komputilo: computer") 一个无效的 json 字符串 jsonlint.com no komputilo 是页面开始时的 $vorto = $_GET['vorto']。【参考方案3】:您的示例网址返回
?("text":"<b>peti</b>: ask, ask for, beg, bid, request")
JSONP 不是有效的 JSON,它会将其包装到您提供的回调中,例如
callbackname(JSONIsInHere)
因此,您需要将 $AVcontent 从 ( 的第一次出现到 ) 的最后一次出现子串化,这样您将获得回调参数,该参数是有效的 JSON 并且可以使用 json_decode 进行编码。
【讨论】:
以上是关于jsonp -> json_decode()的主要内容,如果未能解决你的问题,请参考以下文章
php中json_encode和json_decode的用法
php中json_decode()和json_encode()的使用方法