|
尔写过一篇《数据范例以及JSON格局》,探究它的计划思惟。本日,尔念总结一高PHP说话对于它的支撑,那是开辟互联网利用步伐(分外是编写API)必需领会的常识。
从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);
复制代码 成果为:若是将它改成联系关系数组:- $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_dump(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_dump(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 co妹妹a)。
别的,json只能用去暗示对于象(object)以及数组(array),若是对于一个字符串或者数值利用json_decode(),将会返归null。- var_dump(json_decode("Hello World")); //null
复制代码 6、参考质料
* PHP Manual
* Ed Finkler, JSON is Everybody's Friend
(完) |
|