如何在php中正确的使用json


Posted in PHP onAugust 06, 2013

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

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

2、索引数组和关联数组
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 );

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

4、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)
}

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中使用Oracle数据库(4)
Oct 09 PHP
很实用的一个完整email发送程序
Oct 09 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
php替换超长文本中的特殊字符的函数代码
May 22 PHP
PHP文章按日期(月日)SQL归档语句
Nov 29 PHP
sql注入与转义的php函数代码
Jun 17 PHP
php strrpos()与strripos()函数
Aug 31 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
javascript some()函数用法详解
Nov 13 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
Aug 11 PHP
PHP 二级子目录(后台目录)设置二级域名
Mar 02 PHP
PHP执行普通shell命令流程解析
Aug 24 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 #PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 #PHP
解析php中如何调用用户自定义函数
Aug 06 #PHP
使用php实现截取指定长度
Aug 06 #PHP
php 如何获取数组第一个值
Aug 06 #PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 #PHP
php实现统计邮件大小的方法
Aug 06 #PHP
You might like
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
JS实现简易计算器
2020/02/14 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
更改Python命令行交互提示符的方法
2015/01/14 Python
python简单分割文件的方法
2015/07/30 Python
详解python eval函数的妙用
2017/11/16 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
苹果香港官方商城:Apple香港
2016/09/14 全球购物
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
测绘工程个人的自我评价
2013/11/23 职场文书
报到证丢失证明
2014/01/11 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
个人党性分析材料
2014/12/19 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP