详解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 归并排序 数组交集
May 10 PHP
PHP生成sitemap.xml地图函数
Nov 13 PHP
PHP实现过滤各种HTML标签
May 17 PHP
PHP实现仿Google分页效果的分页函数
Jul 29 PHP
PHP实现linux命令tail -f
Feb 22 PHP
Yii2框架使用计划任务的方法
May 25 PHP
php使用curl实现简单模拟提交表单功能
May 15 PHP
Laravel中的Auth模块详解
Aug 17 PHP
php命令行写shell实例详解
Jul 19 PHP
详解php伪造Referer请求反盗链资源
Jan 24 PHP
PHP进阶学习之Geo的地图定位算法详解
Jun 19 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 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学习笔记 类的声明与对象实例化
2011/06/13 PHP
php使用curl访问https示例分享
2014/01/17 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
jquery的键盘事件修改代码
2011/02/24 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
vue将data恢复到初始状态 && 重新渲染组件实例
2020/09/04 Javascript
Python selenium根据class定位页面元素的方法
2019/02/26 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
浅析NumPy 切片和索引
2020/09/02 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
交通事故赔偿协议书范本
2014/04/15 职场文书
个人承诺书怎么写
2014/05/24 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript
Python开发五子棋小游戏
2022/04/28 Python
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技
MySQL数据库查询之多表查询总结
2022/08/05 MySQL