JSON在PHP中的应用介绍


Posted in PHP onSeptember 08, 2012

从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)#1 (5) { 


["a"] => int(1) 


["b"] => int(2) 


["c"] => int(3) 


["d"] => int(4) 


["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(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 25 PHP
PHP执行linux系统命令的常用函数使用说明
Apr 27 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
Php连接及读取和写入mysql数据库的常用代码
Aug 11 PHP
PHP实现的sqlite数据库连接类
Dec 12 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
Mar 07 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 #PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 #PHP
用C/C++扩展你的PHP 为你的php增加功能
Sep 06 #PHP
初步介绍PHP扩展开发经验分享
Sep 06 #PHP
php写的带缓存数据功能的mysqli类
Sep 06 #PHP
一个PHP并发访问实例代码
Sep 06 #PHP
PHP连接MongoDB示例代码
Sep 06 #PHP
You might like
PHP实现MySQL更新记录的代码
2008/06/07 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
JavaScript的public、private和privileged模式
2009/12/28 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
微信小程序实现蓝牙打印
2019/09/23 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
Python使用爬虫猜密码
2016/02/19 Python
Python中动态创建类实例的方法
2017/03/24 Python
Python 互换字典的键值对实例
2019/02/12 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
圣诞节活动策划方案
2014/06/09 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
我爱我班主题班会
2015/08/13 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书