详解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开发文件系统实例讲解
Oct 09 PHP
php反射应用示例
Feb 25 PHP
ThinkPHP3.1之D方法实例详解
Jun 20 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
PHP命名空间简单用法示例
Dec 28 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
Apr 01 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
php提高网站效率的技巧
2015/09/29 PHP
PHP中header用法小结
2016/05/23 PHP
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
使用js写的一个简易的投票
2013/11/27 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
微信小程序之GET请求的实例详解
2017/09/29 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
Python新手实现2048小游戏
2015/03/31 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
python安装本地whl的实例步骤
2019/10/12 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
RealTek面试题
2016/06/28 面试题
大学运动会通讯稿
2014/01/28 职场文书
学校班班通实施方案
2014/06/11 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
小学数学教师研修日志
2015/11/13 职场文书
《刷子李》教学反思
2016/02/20 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书