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 相关文章推荐
用PHP和ACCESS写聊天室(十)
Oct 09 PHP
MYSQL数据库初学者使用指南
Nov 16 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
什么情况下可以不写PHP的闭合标签“?>”
Aug 28 PHP
PHP使用CURL实现多线程抓取网页
Apr 30 PHP
php类自动加载器实现方法
Jul 28 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
laravel 修改.htaccess文件 重定向public的解决方法
Oct 12 PHP
关于PHP5.6+版本“No input file specified”问题的解决
Dec 11 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/08/01 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python爬虫文件下载图文教程
2018/12/23 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
PyQt5实现简易计算器
2020/05/30 Python
python3 使用traceback定位异常实例
2020/03/09 Python
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
幼儿园中班上学期评语
2014/04/18 职场文书
员工薪酬激励方案
2014/06/13 职场文书
国庆横幅标语
2014/10/08 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers