在PHP语言中使用JSON和将json还原成数组的方法


Posted in PHP onJuly 19, 2016

在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考。内容如下

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

一、json_encode()

<?php 
$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语言中使用JSON和将json还原成数组的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
sourcesafe管理phpproj文件的补充说明(downmoon)
Apr 11 PHP
php中的三元运算符使用说明
Jul 03 PHP
php继承的一个应用
Sep 06 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
Oct 29 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
使用淘宝IP库获取用户ip地理位置
Oct 27 PHP
php 强制下载文件实现代码
Oct 28 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 PHP
PHP+MySQL实现的简单投票系统实例
Feb 24 PHP
JSON两种结构之对象和数组的理解
Jul 19 #PHP
深入理解PHP JSON数组与对象
Jul 19 #PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
Jul 18 #PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 #PHP
PHP中set_include_path()函数相关用法分析
Jul 18 #PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 #PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 #PHP
You might like
有关PHP性能优化的介绍
2013/06/20 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
php中动态调用函数的方法
2015/03/16 PHP
php版交通银行网银支付接口开发入门教程
2016/09/26 PHP
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
AngularJs每天学习之总体介绍
2017/08/07 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
django 多数据库配置教程
2018/05/30 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
Python3中函数参数传递方式实例详解
2019/05/05 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
现金会计岗位职责
2013/12/05 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
学生安全责任书范本
2014/07/24 职场文书
初一军训感言
2015/08/01 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
sql字段解析器的实现示例
2021/06/23 SQL Server