详解json在php中的应用


Posted in PHP onSeptember 30, 2018

从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)[2]
 public 'a' => int 1
 public 'b' => int 2
 public 'c' => int 3
 public 'd' => int 4
 public '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 (size=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扩展ZF――Validate扩展
Jan 10 PHP
php Try Catch异常测试
Mar 01 PHP
php简单提示框alert封装函数
Aug 08 PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
Aug 14 PHP
php实现的Captcha验证码类实例
Sep 22 PHP
php截取字符串函数分享
Feb 02 PHP
PHP输出九九乘法表代码实例
Mar 27 PHP
php如何连接sql server
Oct 16 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
php实现微信原生支付(扫码支付)功能
May 30 PHP
php实现数组重复数字统计实例
Sep 30 #PHP
PHP APP微信提现接口代码
Sep 30 #PHP
PHP实现微信提现功能
Sep 30 #PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 #PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 #PHP
PHP使用函数用法详解
Sep 30 #PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 #PHP
You might like
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
javascript调试说明
2010/06/07 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python中使用%与.format格式化文本方法解析
2017/12/27 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
python 调整图片亮度的示例
2020/12/03 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
护士上岗前培训自我鉴定
2014/04/20 职场文书
美食节策划方案
2014/05/26 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python