网站开发日志

2009年7月26日星期日

分享家:Addthis中国

json问题

今天在给我的一個網站写一个很小的API,主要是在服务器端提供一组数据,如果按照往常我会使用XML,但是最近在学习json,所以就json来试试。按照我上篇日志的介绍,代码如下:

<?php
require("../lib/config.inc.php");
require("../lib/Database.class.php");
$db = new Database($config['server'], $config['user'], $config['pass'], $config['database'], $config['tablePrefix']);
// connect to the server
$db->connect();  
$sql = "SELECT * FROM results ORDER BY UID DESC LIMIT 1";  
$row = $db->query_first($sql);
$current_year = date('Y');
$year = $row['Year'];
$row['Next_Term'] = ($current_year == $year) ? ($row['Term'] + 1) : 1;
$row['Next_Year'] = $current_year;
$row['Next_DRAW_DATE'] = date('Y-m-d');
//上面的代码产生一组数组,然后用json_encode($row)产生json格式的字符串
echo json_encode($row);
?>

接下来,我在本地又写了一段代码,准备用来掉用上面写好的api,然后用json_decode, 把数组还原。

<?php
$url = 'http://www.cpzhan.com/api/getTerm.php';
$jsonfeed = file_get_contents($url);
echo $jsonfeed;
//这里我收到到了json格式的字符串
$result = json_decode($jsonfeed, true);
print_r ($result);
//!!!但是这里无法还原编码前的数组
?>

不知道什么原因,json_decode无法还原编码前的数组。很明显,我上面写的api输出的字符串无法被json_decode识别,但是API的输出看上去的确是合法的json格式。我还试着给api的输出加上header如下, 終于找到原因了, 見netbean-ide一文的介绍)

<?php
ini_set('display_errors', 0);
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); 
header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" ); 
header("Cache-Control: no-cache, must-revalidate" ); 
header("Pragma: no-cache" );
header("Content-type: application/json; charset=utf-8");
.....

但是还是没有起任何作用。最后我放弃了这种方法,改用我曾经介绍过的jQuery获取JSON数据的方法:

<script>
   $.getJSON("http://www.cpzhan.com/api/getTerm.php?callback=?",
   function(data){//data这里是JSON对象,它可以是由多个JSON对象组成
      $("#year").val(data.Next_Year);
      $("#term").val(data.Next_Term);
      $("#date").val(data.Next_DRAW_DATE);
   });
</script>

一开始,我收到错误信息:invalid label,上网搜索了一下终于找到了原因,原来jQuery在调用getJSON的时候会在callback后自动加上值,因此我的产生JSON数据的时候要加上callback, 并且要用大括号把encode后的JSON数据包裹。如下:

<?php
ini_set('display_errors', 0);
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); 
header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" ); 
header("Cache-Control: no-cache, must-revalidate" ); 
header("Pragma: no-cache" );
header("Content-type: application/json; charset=utf-8");
//$row是要传递的数组
$jsonp = $_GET['callback']; //callback的是jquery自动加入的
$myJSON = json_encode($row);
echo $jsonp. '(' . $myJSON . ')'; //注意:json_encode的结果被大括号包裹

至于为什么要这么做我还没有搞懂(可能是出于安全的考虑),但是我想这很可能是我上面用PHP获取JSON数据失败的原因,我们必须对API的输出做特殊处理后,json_decode才可以识别。如果有朋友对JSON精通,请留言告知。谢谢!

标签: ,

相关文章:

2 条评论:

  • 前几天用json_decode的时候也遇到很郁闷的问题,发现json格式的字符串里,字符串一定要用双引号,用单引号时不能还原成功。
    比如:
    $json = '[{"i":"message","h":"231","w":"391"},{"i":"equipment","h":"231","w":"328"}]';
    不能写成
    $json = "[{'i':'message','h':'231','w':'391'},{'i':'equipment','h':'231','w':'328'}]";

    当时我也以为我的json格式是正确的。但发现单引号在json_decode 面前行行不通。

    不知道你的遇到的也是这个问题

    作者 Blogger 扑街囝, 时间 2009年7月27日 上午1:45  

  • 我使用PHP5.2自带的函数json_encode()来产生json字符串的,所以它的确是用的是双引号。
    问题是我在另外一部服务器上用file_get_contents()来获取json字符串后,无法用json_decode将其还原。

    作者 Blogger D Cai, 时间 2009年7月27日 上午9:37  

发表评论

指向此帖子的链接:

创建链接