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的网址
Nov 25 PHP
在PHP中读取和写入WORD文档的代码
Apr 09 PHP
收藏的PHP常用函数 推荐收藏保存
Feb 21 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
PHP中的替代语法简介
Aug 22 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
浅析PHP数据导出知识点
Feb 17 PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 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
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
解析vue中的$mount
2017/12/21 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
python中私有函数调用方法解密
2016/04/29 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
2018/04/18 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
python 常见的反爬虫策略
2020/09/27 Python
HTML5 weui使用笔记
2019/11/21 HTML / CSS
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
2013年大学生的自我鉴定
2013/10/24 职场文书
冬季安全检查方案
2014/05/23 职场文书
计算机网络专业求职信
2014/06/05 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
研讨会通知
2015/04/27 职场文书
个人廉政承诺书
2015/04/28 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python