找回密码
 注册
搜索
查看: 1758|回复: 0

在PHP语言中使用JSON

[复制链接]
发表于 2012-10-11 23:45:25 | 显示全部楼层 |阅读模式
  尔写过一篇《数据范例以及JSON格局》,探究它的计划思惟。本日,尔念总结一高PHP说话对于它的支撑,那是开辟互联网利用步伐(分外是编写API)必需领会的常识。
  从5.2版原起头,PHP本熟供给json_encode()以及json_decode()函数,前者用于编码,后者用于解码。
  1、json_encode()
  该函数重要用去将数组以及对于象,转换为json格局。先望一个数组转换的例子:
  1.   $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
  2.   echo json_encode($arr);
复制代码
成果为
  1.   {"a":1,"b":2,"c":3,"d":4,"e":5}
复制代码
再望一个对于象转换的例子:
  1.   $obj->body
  2.   = 'another post';
  3.   $obj->id
  4.   = 21;
  5.   $obj->approved
  6.   = true;
  7.   $obj->favorite_count = 1;
  8.   $obj->status
  9.   = NULL;
  10.   echo json_encode($obj);
复制代码
成果为
  1.   {
  2.   "body":"another post",
  3.   "id":21,
  4.   "approved":true,
  5.   "favorite_count":1,
  6.   "status":null
  7.   }
复制代码
因为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)转为对于象格局。
  好比,如今有一个索引数组
  1.   $arr = Array('one', 'two', 'three');
  2.   echo json_encode($arr);
复制代码
成果为:
  1.  ["one","two","three"]
复制代码
若是将它改成联系关系数组:
  1.   $arr = Array('1'=>'one', '2'=>'two', '3'=>'three');
  2.   echo json_encode($arr);
复制代码
成果便变了:
  1.   {"1":"one","2":"two","3":"three"}
复制代码
细致,数据格局从"[]"(数组)酿成了"{}"(对于象)。
  若是您必要将"索引数组"逼迫转化成"对于象",能够如许写
  1.   json_encode( (object)$arr );
复制代码
大概
  1.   json_encode ( $arr, JSON_FORCE_OBJECT );
复制代码
3、类(class)的转换
  上面是一个PHP的类:
  1.   class Foo {
  2.   const
  3.   ERROR_CODE = '404';
  4.   public
  5.   $public_ex = 'this is public';
  6.   private   $private_ex = 'this is private!';
  7.   protected $protected_ex = 'this should be protected';
  8.   public function getErrorCode() {
  9.   return self::ERROR_CODE;
  10.   }
  11.   }
复制代码
如今,对于那个类的真例举行json转换:
  1.   $foo = new Foo;
  2.   $foo_json = json_encode($foo);
  3.   echo $foo_json;
复制代码
输没成果是
  1.   {"public_ex":"this is public"}
复制代码
能够望到,除公然变质(public),其余工具(常质、公有变质、法子等等)皆遗掉了。
  4、json_decode()
  该函数用于将json文原转换为响应的PHP数据布局。上面是一个例子:
  1.   $json = '{"foo": 12345}';
  2.   $obj = json_decode($json);
  3.   print $obj->{'foo'}; // 12345
复制代码
凡是环境高,json_decode()老是返归一个PHP对于象,而没有是数组。好比:
  1.   $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
  2.   var_dump(json_decode($json));
复制代码
成果便是天生一个PHP对于象:
  1.   object(stdClass)#1 (5) {
  2.   ["a"] => int(1)
  3.   ["b"] => int(2)
  4.   ["c"] => int(3)
  5.   ["d"] => int(4)
  6.   ["e"] => int(5)
  7.   }
复制代码
若是念要逼迫天生PHP联系关系数组,json_decode()必要添一个参数true:
  1.   $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
  2.   var_dump(json_decode($json),true);
复制代码
成果便熟成为了一个联系关系数组:
  1.   array(5) {
  2.   ["a"] => int(1)
  3.   ["b"] => int(2)
  4.   ["c"] => int(3)
  5.   ["d"] => int(4)
  6.   ["e"] => int(5)
  7.   }
复制代码
5、json_decode()的常睹毛病
  上面三种json写法皆是错的,您能望犯错正在那边吗?
  1.   $bad_json = "{ 'bar': 'baz' }";
  2.   $bad_json = '{ bar: "baz" }';
  3.   $bad_json = '{ "bar": "baz", }';
复制代码
对于那三个字符串实行json_decode()皆将返归null,而且报错。
  第一个的毛病是,json的分开符(delimiter)只容许利用单引号,不克不及利用双引号。第两个的毛病是,json名值对于的"名"(冒号左侧的部门),任何环境高皆必需利用单引号。第三个的毛病是,末了一个值以后不克不及增加逗号(trailing co妹妹a)。
  别的,json只能用去暗示对于象(object)以及数组(array),若是对于一个字符串或者数值利用json_decode(),将会返归null。
  1.   var_dump(json_decode("Hello World")); //null
复制代码
6、参考质料
  * PHP Manual
  * Ed Finkler, JSON is Everybody's Friend
  (完)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|QQ客服|联系我们|Archiver|手机版|小黑屋|悉远网络 ( 鄂ICP备09013446号 )

GMT+8, 2024-11-21 18:46 , Processed in 0.036848 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表