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。

原因:

JSONPJSON 不同。它包含破坏 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 &gt;= 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()的主要内容,如果未能解决你的问题,请参考以下文章

json_encode和json_decode

json_decode和json_encode的区别

php中json_encode和json_decode的用法

php中json_decode()和json_encode()的使用方法

PHP中json_decode()和json_encode()的使用方法

请教:php如何实现json的传值