详解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 相关文章推荐
source.php查看源文件
Dec 09 PHP
JS实现php的伪分页
May 25 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
php实现查询百度google收录情况(示例代码)
Aug 02 PHP
php实现的DateDiff和DateAdd时间函数代码分享
Aug 16 PHP
php数组使用规则分析
Feb 27 PHP
给WordPress中的留言加上楼层号的PHP代码实例
Dec 14 PHP
php实现的三个常用加密解密功能函数示例
Nov 06 PHP
PHP实现类似题库抽题效果
Aug 16 PHP
php + WebUploader实现图片批量上传功能
May 06 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 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/05/12 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
初步解析Python下的多进程编程
2015/04/28 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
基于Python实现用户管理系统
2019/02/26 Python
python中嵌套函数的实操步骤
2019/02/27 Python
详解python中的hashlib模块的使用
2019/04/22 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
美国精油公司:Plant Therapy
2019/05/17 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
物理力学求职信
2014/02/18 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
优质服务口号
2014/06/11 职场文书
幼儿园安全生产月活动总结
2014/07/05 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
党员民主评议自我评价
2014/10/20 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
详解Python描述符的工作原理
2021/06/11 Python
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL