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执行速率优化技巧小结
Mar 15 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 PHP
php针对cookie操作的队列操作类实例
Dec 10 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
推荐10个提供免费PHP脚本下载的网站
Dec 31 PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
thinkphp框架使用JWTtoken的方法详解
Oct 10 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
PHP创建XML接口示例
2019/07/04 PHP
javascript下判断一个元素是否存在的代码
2010/03/05 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
vue增删改查的简单操作
2017/07/15 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
python实现ipsec开权限实例
2014/11/11 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
详解Django 时间与时区设置问题
2019/07/23 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
django的autoreload机制实现
2020/06/03 Python
中国最大的名表商城:万表网
2016/08/29 全球购物
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
绝对经典成功的大学生推荐信
2013/11/08 职场文书
教师应聘个人求职信
2013/12/10 职场文书
元旦联欢会主持词
2014/03/26 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
入党积极分子个人总结
2015/03/02 职场文书
人工作失职检讨书
2015/05/05 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
python 实现的截屏工具
2021/05/08 Python
MySQL 语句执行顺序举例解析
2022/06/05 MySQL