本章节我们将为大家介绍如何使用 PHP 语言来编码和解码 JSON 对象。
环境配置
在 php5.2.0 及以上版本已经内置 JSON 扩展。
JSON 函数
函数 | 描述 |
---|---|
json_encode | 对变量进行 JSON 编码 |
json_decode | 对 JSON 格式的字符串进行解码,转换为 PHP 变量 |
json_last_error | 返回最后发生的错误 |
json_encode
PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。
语法
- string json_encode ( $value [, $options = 0 ] )
参数
- value: 要编码的值。该函数只对 UTF-8 编码的数据有效。
- options:由以下常量组成的二进制掩码:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
实例
以下实例演示了如何将 PHP 数组转换为 JSON 格式数据:
- <?php
- $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}
以下实例演示了如何将 PHP 对象转换为 JSON 格式数据:
- <?php
- class Emp {
- public $name = "";
- public $hobbies = "";
- public $birthdate = "";
- }
- $e = new Emp();
- $e->name = "sachin";
- $e->hobbies = "sports";
- $e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
- $e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));
- echo json_encode($e);
- ?>
以上代码执行结果为:
- {"name":"sachin","hobbies":"sports","birthdate":"08\/05\/1974 12:20:03 pm"}
json_decode
PHP json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。
语法
- mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
参数
json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据
assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。
depth: 整数类型的参数,它指定递归深度
options: 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。
实例
以下实例演示了如何解码 JSON 数据:
- <?php
- $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
- var_dump(json_decode($json));
- var_dump(json_decode($json, true));
- ?>
以上代码执行结果为:
- object(stdClass)#1 (5) {
- ["a"] => int(1)
- ["b"] => int(2)
- ["c"] => int(3)
- ["d"] => int(4)
- ["e"] => int(5)
- }
- array(5) {
- ["a"] => int(1)
- ["b"] => int(2)
- ["c"] => int(3)
- ["d"] => int(4)
- ["e"] => int(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_dump(json_decode("Hello World")); //将返回null
索引数组和关联数组
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 );
类(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),其他东西(常量、私有变量、方法等等)都遗失了。
转载本站内容时,请务必注明来自W3xue,违者必究。