json常用来作为数据交换的一种格式,和xml相比体积更小。缺点就是层级关系不明显不大容易被理解。java中操作json有多种方式像JSONArray,JSONObject等,现在php对json的支持也还算可以。php中生成json要借助array和json_encode,json_decode一起使用。越复杂的json嵌套的数组越多,来看下原理吧。
1.普通一维数组和json的转换
<?php header('Content-type: text/html; charset=UTF-8'); $arr=array('潘玮柏','苏有朋','蔡依林'); $str=json_encode($arr,JSON_UNESCAPED_UNICODE); echo $str.'</br>'; ?>这段代码生成的json如下
["潘玮柏","苏有朋","蔡依林"] ,这种方式类似java里的JSONArray
2.关联数组进行json_encode会怎样呢
<?php header('Content-type: text/html; charset=UTF-8'); $arr2=array('name'=>'黄晓明','age'=>'30','height'=>'180'); $str2=json_encode($arr2,JSON_UNESCAPED_UNICODE); echo $str2.'</br>'; ?>
复杂的json也就是把这几种数组嵌套很多层就出来了,下面来生成一个复杂的json字符串
{"name":"潘玮柏","id":"01","message":[{"hobby":"游泳","place":"夏威夷"},{"hobby":"篮球","place":"纽约"}]}
这个json串看起来稍微有点吓人,来看看我怎么弄出来的,我直接上代码了
<?php header('Content-type: text/html; charset=UTF-8'); $arr=array('name'=>'潘玮柏','id'=>'01','message'=>array(array('hobby'=> '游泳', 'place'=>'夏威夷'),array('hobby'=> '篮球', 'place'=>'纽约'))); $str=json_encode($arr,JSON_UNESCAPED_UNICODE); echo json_encode($arr,JSON_UNESCAPED_UNICODE).'</br>'; echo "<pre>"; print_r(json_decode($str)); echo "</pre>"; foreach(json_decode($str) as $key=>$val){ if("message"==$key){ foreach($val as $key2=>$val2){ echo "</br>"; foreach($val2 as $key3=>$val3){ echo "$key3--$val3"." "; } } }else{ echo "$key--$val"." "; } } ?>
stdClass Object ( [name] => 潘玮柏 [id] => 01 [message] => Array ( [0] => stdClass Object ( [hobby] => 游泳 [place] => 夏威夷 ) [1] => stdClass Object ( [hobby] => 篮球 [place] => 纽约 ) ) )
基于这种情况我觉得php的基础很重要,在基础扎实的情况下还要知道其中的原理。为了更好的巩固json我再给一个自己写的2个下拉联动的效果,这个例子会使用到一些jquery的知识。例子就是上海轨道交通的一号线和二号线以及对应的站点
先上一个php,这个php用来生成线路的json
<?php header('Content-type: text/html; charset=UTF-8'); $arr=array('linemessage'=>array(array('id'=>'line1',"linename"=>'一号线'),array('id'=>'line2',"linename"=>'二号线'))); $str=json_encode($arr,JSON_UNESCAPED_UNICODE); echo $str; ?>
<?php header('Content-type: text/html; charset=UTF-8'); if($_POST["line"]=="line1"){ $arr=array('info'=>array(array('id'=>'01','name'=>'莘庄'),array('id'=>'02','name'=>'徐家汇'),array('id'=>'03','name'=>'漕宝路'),array('id'=>'04','name'=>'陕西南路'),array('id'=>'05','name'=>'汶水路路'))); }else if($_POST["line"]=="line2"){ $arr=array('info'=>array(array('id'=>'03','name'=>'川沙'),array('id'=>'04','name'=>'广兰路'),array('id'=>'06','name'=>'浦东国际机场'),array('id'=>'07','name'=>'虹桥二号航站楼'))); } $str=json_encode($arr,JSON_UNESCAPED_UNICODE); echo $str; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> $(document).ready(function(){ $.post("getlinejson.php", function(data) { var jsonvars = data.linemessage; $("#line").append("<option value='-1'>==请选择==</option>"); $("#station").append("<option value='-1'>==请选择==</option>"); for (var i = 0; i < jsonvars.length; i++) { var lineMessage=jsonvars[i].linename; var lineId=jsonvars[i].id; $("#line").append("<option value='"+lineId+"'>" + lineMessage+ "</option>"); } }, "json"); //线路下拉改变事件 $("#line").change(function(){ $.post("getstationjson.php",{line:$("#line").val()}, function(data) { $("#station").empty(); $("#station").append("<option value='-1'>==请选择==</option>"); var temp=data.info; for(var i = 0; i < temp.length; i++) { var stationName=temp[i].name; var stationId=temp[i].id; $("#station").append("<option value='"+stationId+"'>" + stationName+ "</option>"); } }, "json"); }); }); </script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>下拉级联操作</title> </head> <body> 线路:<select id="line"> </select> 站点:<select id="station"> </select> </body> </html>
来看看运行效果图
看到这里是不是觉得json有时用处也特别大呢