phpjson參數
『壹』 php如何發送和接收JSON數據
對於json,PHP有對應的方法進行操作。
一般而言,json會以字元串形式傳給PHP腳本,一般都是放在$_POST裡面,
14
<?php
// 接收
$json_parameter = $_POST['json_str'];
// 處理, 變成數組
$array = json_decode($json_parameter);
// PHP 把數組數據變成json格式字元串,發給頁面
$demo = array(
'key' => 'value',
'key2' => 'value2'
);
$demo_json = json_encode($demo); // 格式是{"key":"value","key2":"value2"}
echo $demo_json;
『貳』 php 涓搴忓垪鍖栧拰json浣跨敤浠嬬粛
銆銆銆愬簭鍒楀寲鐨勬傚康銆
銆銆搴忓垪鍖栨槸灝嗗硅薄鐘舵佽漿鎹涓哄彲淇濇寔鎴栧彲浼犺緭鐨勬牸寮忕殑榪囩▼ 涓庡簭鍒楀寲鐩稿圭殑鏄鍙嶅簭鍒楀寲 瀹冨皢嫻佽漿鎹涓哄硅薄 榪欎袱涓榪囩▼緇撳悎璧鋒潵 鍙浠ヨ交鏉懼湴瀛樺偍鍜屼紶杈撴暟鎹
銆銆灝嗗硅薄鐨勭姸鎬佷俊鎮杞鎹涓哄彲浠ュ瓨鍌ㄦ垨浼犺緭鐨勭獥浣撶殑榪囩▼ 鍦ㄥ簭鍒楀寲鏈熼棿 瀵硅薄灝嗗叾褰撳墠鐘舵佸啓鍏ュ埌涓存椂鎴栨寔涔呮у瓨鍌ㄥ尯 浠ュ悗 鍙浠ラ氳繃浠庡瓨鍌ㄥ尯涓璇誨彇鎴栧弽搴忓垪鍖栧硅薄鐨勭姸鎬 閲嶆柊鍒涘緩璇ュ硅薄
銆銆閫氬父 瀵硅薄瀹炰緥鐨勬墍鏈夊瓧孌甸兘浼氳搴忓垪鍖 榪欐剰鍛崇潃鏁版嵁浼氳琛ㄧず涓哄疄渚嬬殑搴忓垪鍖栨暟鎹 榪欐牱 鑳藉熻В閲婅ユ牸寮忕殑浠g爜鏈夊彲鑳借兘澶熺『瀹氳繖浜涙暟鎹鐨勫 鑰屼笉渚 璧栦簬璇ユ垚鍛樼殑鍙璁塊棶鎬 綾諱技鍦 鍙嶅簭鍒楀寲浠庡簭鍒楀寲鐨勮〃紺哄艦寮忎腑鎻愬彇鏁版嵁 騫剁洿鎺ヨ劇疆瀵硅薄鐘舵 榪欎篃涓庡彲璁塊棶鎬ц勫垯鏃犲叧 瀵逛簬浠諱綍鍙鑳藉寘鍚閲嶈佺殑瀹夊叏鎬ф暟鎹鐨勫硅薄 濡傛灉鍙鑳 搴旇ヤ嬌璇ュ硅薄涓嶅彲搴忓垪鍖 濡傛灉瀹冨繀欏諱負鍙搴忓垪鍖栫殑 璇峰皾璇曠敓鎴愮壒瀹氬瓧孌墊潵淇濆瓨涓嶅彲搴忓垪鍖栫殑閲嶈佹暟鎹 濡傛灉鏃犳硶瀹炵幇榪欎竴鐐 鍒欏簲娉ㄦ剰璇ユ暟鎹浼氳鍏寮緇欎換浣曟嫢鏈夊簭鍒楀寲鏉冮檺鐨勪唬鐮 騫剁『淇濅笉璁╀換浣曟伓鎰忎唬鐮佽幏寰楄ユ潈闄
銆銆銆怞SON鐨勬傚康銆
銆銆JSON javaScript Object Notation 涓縐嶆洿杞 鏇村弸濂界殑鐢ㄤ簬鎺ュ彛(AJAX REST絳)鏁版嵁浜ゆ崲鐨勬牸寮 JSON鏄緇撴瀯鍖栨暟鎹涓茶屽寲鐨勬枃鏈鏍煎紡 浣滀負XML鐨勪竴縐嶆浛浠e搧 鐢ㄤ簬琛ㄧず瀹㈡埛絝涓庢湇鍔″櫒闂存暟鎹浜ゆ崲鏈夋晥璐熻澆鐨勬牸寮 瀹冩槸浠嶦CMAScript璇璦鏍囧噯 琛嶇敓鑰屾潵鐨 JSON鐨勮捐$洰鏍囨槸浣垮畠鎴愪負灝忕殑 杞諱究鐨 鏂囨湰鐨 鑰屼笖鏄疛avaScript鐨勪竴涓瀛愰泦
銆銆銆愰暱搴︾殑姣旇緝銆
銆銆濡備笅涓孌典唬鐮 鏄劇ず浜嗗規暟緇勫拰瀵硅薄緙栫爜鍚庣敓鎴愮殑瀛楃︿覆鍙婂叾闀垮害
澶嶅埗浠g爜 浠g爜濡備笅: class Foo {銆銆public $int = ; public $bool = TRUE; public $array = array(array( ) => test string );
銆銆public function test($flag) { echo $flag test function for Foo <br /> ; }
銆銆public static function output($str) { echo $str <br /> ; }
銆銆public static function pare_serialize_and_json($data) { $serialize_str = serialize($data); self::output( 搴忓垪鍖栧悗鐨勫: $serialize_str "; length=" strlen($serialize_str));
銆銆$json_str = json_encode($data); self::output( JSON鍚庣殑鍊: $json_str "; length=" strlen($json_str)); }
銆銆}
銆銆$test_data = array( w => phppan => => ); //搴忓垪鍖栨暟緇
銆銆echo 鏁扮粍 <br /> ; Foo::pare_serialize_and_json($test_data);
銆銆$foo = new Foo(); echo 瀵硅薄:<br /> ; Foo::pare_serialize_and_json($foo);
銆銆杈撳嚭
澶嶅埗浠g爜 浠g爜濡備笅: 鏁扮粍 搴忓垪鍖栧悗鐨勫:a: :{s: :"w";i: ;s: :"phppan";i: ;s: :"";i: ;}; length= JSON鍚庣殑鍊:{"w": "phppan": "": }; length= 瀵硅薄: 搴忓垪鍖栧悗鐨勫:O: :"Foo": :{s: :"int";i: ;s: :"bool";b: ;s: :"array";a: :{i: ; a: :{i: ;i: ;}i: ;s: :"test";i: ;s: :"string";}}; length= JSON鍚庣殑鍊:{"int": "bool":true "array":{" ":[ ] " ":"test" " ":"string"}}; length=銆銆寰堟槑鏄劇殑闀垮害鍖哄埆 serialize鍦ㄧ紪鐮佸悗澶ф傛槸json鐨勪袱鍊
銆銆鍘熷洜
銆銆•serialize鍚庡瓧絎︿覆鍖呭惈浜嗗瓙涓茬殑闀垮害 榪欏彲鑳芥槸閫熷害鏂歸潰鐨勪紭鍖 鍏稿瀷鐨勭┖闂存崲鏃墮棿 浣嗘槸瀹冩湰韜榪樻槸澶閲嶄簡 •serialize鏈夋洿鍔犺︾粏鐨勭被鍨嬪尯鍒 鑰宩son鍙鏈夊洓縐嶇被鍨 騫朵笖鏄浠ョ畝鍗曠殑絎﹀彿琛ㄧず
銆銆銆愰熷害鐨勬瘮杈冦
銆銆浠ヤ唬鐮佽存槑闂棰 濡備笅姣旇緝閫熷害鐨勪唬鐮
澶嶅埗浠g爜 浠g爜濡備笅: $max_index = ; ini_set("memory_limit" " M"); $array = array_fill( rand( ));銆銆echo serialize <br /> ; $start = xdebug_time_index(); for ($i = ; $i < $max_index; $i++) { $str = serialize($array); } $end = xdebug_time_index(); echo $end $start <br /> ;
銆銆echo json <br /> ; $start = xdebug_time_index(); for ($i = ; $i < $max_index; $i++) { $str = json_encode($array); } $end = xdebug_time_index(); echo $end $start <br /> ; unset($array $str);
銆銆杈撳嚭
澶嶅埗浠g爜 浠g爜濡備笅: serialize json銆銆serialize鐨勯熷害鍦ㄥぇ鏁版嵁閲忕殑鎯呭喌涓嬫瘮json宸浜嗗揩涓涓鏁伴噺綰
銆銆浠庝笂闈涓ょ偣鐪 json涓嶇℃槸鍦ㄩ熷害榪樻槸鍦ㄧ敓鎴愮殑瀛楃︿覆鐨勫ぇ灝忎笂閮芥瘮serialize瑕佸ソ 閭d負浠涔坰erialize榪樿佸瓨鍦ㄥ憿錛 鍘熷洜鍦ㄤ笅闈㈣繖涓鐐 瀹炵幇鐨勫姛鑳
銆銆銆愬勭悊瀵硅薄銆
銆銆濡備笅浠g爜
澶嶅埗浠g爜 浠g爜濡備笅: header("Content type:text/;charset=utf "); class Foo { public function test($flag) { echo $flag test function for Foo <br /> ; } }銆銆$foo = new Foo();
銆銆echo 鍙嶅簭鍒楀寲嫻嬭瘯 <br /> ; $foo >test( ); $serialize_str = serialize($foo); $obj = unserialize($serialize_str); $obj >test( );
銆銆$foo >test( ); $json_str = json_encode($foo); $obj = json_decode($json_str); $obj >test( ); die();
銆銆杈撳嚭
澶嶅埗浠g爜 浠g爜濡備笅: 鍙嶅簭鍒楀寲嫻嬭瘯 test function for Foo test function for Foo test function for Foo銆銆( ! ) Fatal error: Call to undefined method stdClass::test()
銆銆json鏃犳硶澶勭悊瀵硅薄鏂規硶絳夋暟鎹
銆銆銆愪嬌鐢ㄨ寖鍥淬
lishixin/Article/program/PHP/201311/20931
『叄』 如何正確運用PHP json
從5.2版本開始,PHP原生提供json_encode()和json_decode()函數,前者用於編碼,後者用於解碼。
1、json_encode()
該函數主要用來將數組和對象,轉換為json格式。先看一個數組轉換的例子:
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);
上面代碼的輸出結果為:
{"a":1,"b":2,"c":3,"d":4,"e":5}
再看一個對象轉換的例子:
復制代碼代碼如下:
$obj->body = 'another post';
$obj->id = 21;
$obj->approved = true;
$obj->favorite_count = 1;
$obj->status = NULL;
echo json_encode($obj);
以上代碼的輸出結果為:
復制代碼代碼如下:
{
"body":"another post",
"id":21,
"approved":true,
"favorite_count":1,
"status":null
}
由於json只接受utf-8編碼的字元,所以json_encode()的參數必須是utf-8編碼,否則會得到空字元或者null。當中文使用GB2312編碼,或者外文使用ISO-8859-1編碼的時候,這一點要特別注意。
2、索引數組和關聯數組
PHP支持兩種數組,一種是只保存"值"(value)的索引數組(indexed array),另一種是保存"名值對"(name/value)的關聯數組(associative array)。
由於javascript不支持關聯數組,所以json_encode()只將索引數組(indexed array)轉為數組格式,而將關聯數組(associative array)轉為對象格式。
比如,現在有一個索引數組:
$arr = Array('one', 'two', 'three');
echo json_encode($arr);
其輸出結果為:
["one","two","three"]
如果將它改為關聯數組:
$arr = Array('1'=>'one', '2'=>'two', '3'=>'three');
echo json_encode($arr);
結果就變了:
{"1":"one","2":"two","3":"three"}
注意,數據格式從"[]"(數組)變成了"{}"(對象)。
如果你需要將"索引數組"強制轉化成"對象",可以這樣寫
json_encode( (object)$arr );
或者:
json_encode ( $arr, JSON_FORCE_OBJECT );
3、類(class)的轉換
下面是一個PHP的類:
復制代碼代碼如下:
class Foo {
const ERROR_CODE = '404';
public $public_ex = 'this is public';
private $private_ex = 'this is private!';
protected $protected_ex = 'this should be protected';
public function getErrorCode() {
return self::ERROR_CODE;
}
}
現在,對這個類的實例進行json轉換:
復制代碼代碼如下:
$foo = new Foo;
$foo_json = json_encode($foo);
echo $foo_json;
輸出結果是:
{"public_ex":"this is public"}
可以看到,除了公開變數(public),其他東西(常量、私有變數、方法等等)都遺失了。
4、json_decode()
該函數用於將json文本轉換為相應的PHP數據結構。下面是一個例子:
復制代碼代碼如下:
$json = '{"foo": 12345}';
$obj = json_decode($json);
print $obj->{'foo'}; // 12345
通常情況下,json_decode()總是返回一個PHP對象,而不是數組。比如:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_mp(json_decode($json));
結果就是生成一個PHP對象:
復制代碼代碼如下:
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
如果想要強制生成PHP關聯數組,json_decode()需要加一個參數true:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_mp(json_decode($json),true);
結果就生成了一個關聯數組:
復制代碼代碼如下:
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
5、json_decode()的常見錯誤
下面三種json寫法都是錯的,你能看出錯在哪裡嗎?
復制代碼代碼如下:
$bad_json = "{ 'bar': 'baz' }";
$bad_json = '{ bar: "baz" }';
$bad_json = '{ "bar": "baz", }';
對這三個字元串執行json_decode()都將返回null,並且報錯。
第一個的錯誤是,json的分隔符(delimiter)只允許使用雙引號,不能使用單引號。第二個的錯誤是,json名值對的"名"(冒號左邊的部分),任何情況下都必須使用雙引號。第三個的錯誤是,最後一個值之後不能添加逗號(trailing comma)。
另外,json只能用來表示對象(object)和數組(array),如果對一個字元串或數值使用json_decode(),將會返回null。
var_mp(json_decode("Hello World")); //null