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 相关文章推荐
浅谈Windows下 PHP4.0与oracle 8的连接设置
Oct 09 PHP
针对初学PHP者的疑难问答(1)
Oct 09 PHP
在PWS上安装PHP4.0正式版
Oct 09 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
php向js函数传参的几种方法
Aug 10 PHP
php命令行用法入门实例教程
Oct 27 PHP
php中的动态调用实例分析
Jan 07 PHP
thinkPHP中_initialize方法实例分析
Dec 05 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
Feb 17 PHP
PHP应用跨时区功能的实现方法
Mar 21 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 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的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
基于Vue实现可以拖拽的树形表格实例详解
2018/10/18 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
python有证书的加密解密实现方法
2014/11/19 Python
python3抓取中文网页的方法
2015/07/28 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
用Python进行简单图像识别(验证码)
2018/01/19 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
Python 获取项目根路径的代码
2019/09/27 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
25岁生日感言
2014/01/13 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
信用卡催款律师函
2015/05/27 职场文书
开票证明
2015/06/23 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书