php json_encode与json_decode详解及实例


Posted in PHP onDecember 13, 2016

一、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 相关文章推荐
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
php不使用copy()函数复制文件的方法
Mar 13 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
Apr 07 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
MAC下通过改apache配置文件切换php多版本的方法
Apr 26 PHP
PHP 中TP5 Request 请求对象的实例详解
Jul 31 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
PHP命令Command模式用法实例分析
Aug 08 PHP
PHP 实现文件压缩解压操作的方法
Jun 14 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 #PHP
php一个文件搞定微信jssdk配置
Dec 12 #PHP
php自定义扩展名获取函数示例
Dec 12 #PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 #PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
Dec 12 #PHP
简单谈谈PHP中的Reload操作
Dec 12 #PHP
php的laravel框架快速集成微信登录的方法
Dec 12 #PHP
You might like
php 信息采集程序代码
2009/03/17 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
python开发之函数定义实例分析
2015/11/12 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
详解python中各种文件打开模式
2020/01/19 Python
Django URL参数Template反向解析
2020/11/24 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
应届毕业生个人自我评价
2013/09/20 职场文书
八年级音乐教学反思
2014/01/09 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
党员承诺书范文
2014/05/19 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
运动会演讲稿200字
2014/08/25 职场文书
健康状况证明书
2014/11/26 职场文书
政协常委会议主持词
2015/07/03 职场文书
小学大队干部竞选稿
2015/11/20 职场文书