详解json在php中的应用


Posted in PHP onSeptember 30, 2018

从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。

一、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编码的时候,这一点要特别注意。

二、索引数组和关联数组

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),其他东西(常量、私有变量、方法等等)都遗失了。

四、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)[2]
 public 'a' => int 1
 public 'b' => int 2
 public 'c' => int 3
 public 'd' => int 4
 public '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 (size=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 相关文章推荐
php单件模式结合命令链模式使用说明
Sep 07 PHP
PHP chmod 函数与批量修改文件目录权限
May 10 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
thinkphp实现like模糊查询实例
Oct 29 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
PHP写的简单数字验证码实例
May 23 PHP
解决laravel 5.1报错:No supported encrypter found的办法
Jun 07 PHP
php实现微信支付之现金红包
May 30 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 PHP
php实现数组重复数字统计实例
Sep 30 #PHP
PHP APP微信提现接口代码
Sep 30 #PHP
PHP实现微信提现功能
Sep 30 #PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 #PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 #PHP
PHP使用函数用法详解
Sep 30 #PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 #PHP
You might like
ajax在joomla中的原生态应用代码
2012/07/19 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Python extract及contains方法代码实例
2020/09/11 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
日本无添加化妆品:HABA
2016/08/18 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
生物化工工艺专业应届生求职信
2013/10/08 职场文书
美德好少年主要事迹
2014/01/29 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
敬老模范事迹
2014/05/21 职场文书
生物科学专业自荐书
2014/06/20 职场文书
国际商务专业求职信
2014/07/15 职场文书
爱国电影观后感
2015/06/19 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android