json问题
今天在给我的一個網站写一个很小的API,主要是在服务器端提供一组数据,如果按照往常我会使用XML,但是最近在学习json,所以就json来试试。按照我上篇日志的介绍,代码如下:
<?phprequire("../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一文的介绍)
<?phpini_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数据包裹。如下:
<?phpini_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 面前行行不通。
不知道你的遇到的也是这个问题
作者
扑街囝, 时间
2009年7月27日 上午1:45
我使用PHP5.2自带的函数json_encode()来产生json字符串的,所以它的确是用的是双引号。
问题是我在另外一部服务器上用file_get_contents()来获取json字符串后,无法用json_decode将其还原。
作者
D Cai, 时间
2009年7月27日 上午9:37
发表评论
指向此帖子的链接:
创建链接