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 相关文章推荐
人大复印资料处理程序_查询篇
Oct 09 PHP
虚拟主机中对PHP的特殊设置
Oct 09 PHP
php巧获服务器端信息
Dec 06 PHP
PHP程序员编程注意事项
Apr 10 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
php删除数组元素示例分享
Feb 17 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
[原创]php逐行读取txt文件写入数组的方法
Jul 02 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
Feb 04 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高级编程-函数-郑阿奇
2011/07/04 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
js获取form的方法
2015/05/06 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
vue中轮训器的使用
2019/01/27 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python下载图片实现方法(超简单)
2017/07/21 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
python实现在线翻译功能
2020/03/03 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
2014年社区宣传工作总结
2014/12/02 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android
python自动化八大定位元素讲解
2021/07/09 Python