今天在给我的cpzhan.com写一个很小的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精通,请留言告知。谢谢!
标签: Jquery, PHP