php json转换相关知识(小结)


Posted in PHP onDecember 21, 2018

最近在查找一个bug的时候,发现前端传过来的json空对象 {} ,被php转换成了空数组 [] 存到了数据库里面, 读取并返回给前端的时候,没有做特殊处理,返回了 [] 给前端,导致一些问题。

所以决定梳理一下php的json转换相关的内容。

索引数组转json

看如下示例代码:

$a = ['aa', 'bb', 'cc'];
$ret = json_encode($a);
var_dump($ret);

打印结果是:

string(16) "["aa","bb","cc"]"

可以看到,索引数组被转换成了json数组

关联数组转json

看如下示例代码:

$a = [ 'a' => 'aa', 'b' => 'bb', 'c' => 'cc'];
$ret = json_encode($a);
var_dump($ret);

打印结果是:

string(28) "{"a":"aa","b":"bb","c":"cc"}"

可以看到,关联数组被转换成了json对象

其实索引数组也可以写成关联数组,看如下代码:

$a = [ 0 => 'aa', 1 => 'bb', 2 => 'cc'];
$ret = json_encode($a);
var_dump($ret);

$a = [ 2 => 'aa', 3 => 'bb', 4 => 'cc'];
$ret = json_encode($a);
var_dump($ret);

打印结果是:

string(16) "["aa","bb","cc"]"
string(28) "{"2":"aa","3":"bb","4":"cc"}"

看第一个,索引数组变成关联数组,使用json_encode的时候,还是转换成了json数组;第二个关联数组,被转化成了json对象

强制把php索引数组转成json对象

上面看到json_encode把 索引数组 转成了 json数组 ,如果要强制转成 json对象 怎么办?

可以用下面这两种方法。第一种方法,是在json_encode的时候设置第二个参数为JSON_FORCE_OBJECT。第二种方法是先强制将php数组变成了php对象,再将php对象转换成json对象

$a = ['aa', 'bb', 'cc'];
$ret = json_encode($a, JSON_FORCE_OBJECT);
var_dump($ret); 

$ret = (object)$a; // 强制将php数组变成了php对象
var_dump($ret); 
$ret = json_encode($ret); // 将php对象转换成json对象
var_dump($ret);

打印结果是:

string(28) "{"0":"aa","1":"bb","2":"cc"}"
object(stdClass)#1 (3) {
  [0]=>
  string(2) "aa"
  [1]=>
  string(2) "bb"
  [2]=>
  string(2) "cc"
}
string(28) "{"0":"aa","1":"bb","2":"cc"}"

json转成数组

$str = '{"name":"zhangsan", "age": 18}';
$ret2 = json_decode($str, true);
var_dump($ret2);

$str = '["q", "w", "e"]';
$ret = json_decode($str, true);
var_dump($ret);
array(2) {
 ["name"]=>
 string(8) "zhangsan"
 ["age"]=>
 int(18)
}
array(3) {
 [0]=>
 string(1) "q"
 [1]=>
 string(1) "w"
 [2]=>
 string(1) "e"
}

可以看到,json_decode方法如果第二个参数是true的话,会把json对象/json数组转成php数组

json转成对象

$str = '{"name":"zhangsan", "age": 18}';
$ret = json_decode($str);
var_dump($ret);

var_dump($ret->name);
object(stdClass)#1 (2) {
 ["name"]=>
 string(8) "zhangsan"
 ["age"]=>
 int(18)
}
string(8) "zhangsan"

如果json_decode方法不加第二个参数的话,默认就是false,会把json对象/json数组转成php里面的对象。php里面的对象,可以使用 -> 访问其变量

对象转成json

看如下示例代码:

class TestJson {
    const CONST_VALUE_A = 'aaa';
    public $b = 'bbb';
    protected $c = 'ccc';
    private $d = 'ddd';
    public function hello() {

        print_r("hello\n");
    }
    public static $stValue = 'st';

}

$test = new TestJson();
var_dump($ret);
$ret = json_encode($test);
var_dump($ret);

打印结果是:

string(11) "{"b":"bbb"}"

可与看到,只有public变量,其他在转换成json的时候都被丢掉了

下面说一下我在本文开头提到的,“发现前端传过来的json空对象 {} ,被php转换成了空数组 [] 存到了数据库里面”

原来我的代码是这样实现的:

存数据相关示例代码:

// 存数据
$raw = file_get_contents('php://input');
$param = json_decode($raw, true);
var_dump($param);
$s = json_encode($param);
var_dump($s); 

……
// 将$s存到了数据库表对应字段里面
……
……

打印结果是:

array(0) {
}
string(2) "[]"

取数据相关示例代码:

// 取数据
$column = json_deocde($c, true);
$resp = [
 'status' => 0,
 'column' => $column,
];
echo json_encode($resp);

打印结果是:

{"status": 0, "column": []}

现在要避免上面这个问题,取出的代码应该这样写,才能实现前端传过来json空对象 {} ,保存在数据库里也是 {} 。从数据库里取出,返回给前端的时候也是一个json空对象 {}

存数据相关代码保持不变,取数据相关示例代码:

// 取数据
$column = json_deocde($c, true);
if (empty($column)) {
 $column = (object)$column; // 强制将php空数组变成了php对象
}
$resp = [
 'status' => 0,
 'column' => $column,
];
echo json_encode($resp);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
PHP垃圾回收机制引用计数器概念分析
Jun 24 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
基于PHPexecl类生成复杂的报表表头示例
Oct 14 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
Jun 06 PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
Apr 06 PHP
PHP后期静态绑定实例浅析
Dec 21 #PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 #PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 #PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 #PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 #PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 #PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 #PHP
You might like
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
不错的JS中变量相关的细节分析
2007/08/13 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
python学习之编写查询ip程序
2016/02/27 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Python常用特殊方法实例总结
2019/03/22 Python
python小项目之五子棋游戏
2019/12/26 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
介绍一下Linux中的链接
2016/05/28 面试题
暑期社会实践方案
2014/02/05 职场文书
工程负责人任命书
2014/06/06 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis
Tomcat弱口令复现及利用
2022/05/06 Servers