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 empty函数判断mysql表单是否为空
Apr 12 PHP
php实现无限级分类实现代码(递归方法)
Jan 01 PHP
php设计模式之命令模式的应用详解
May 21 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
php 过滤英文标点符号及过滤中文标点符号代码
Jun 12 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
php 实现进制相互转换
Apr 07 PHP
PHP封装函数实现生成随机的字符串验证码
Jan 24 PHP
php工具型代码之印章抠图
Jul 18 PHP
Laravel如何实现自动加载类
Oct 14 PHP
thinkphp5实现微信扫码支付
Dec 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
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
php基础教程
2015/08/26 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
javascript编程起步(第三课)
2007/02/27 Javascript
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
js中this对象用法分析
2018/01/05 Javascript
angularJS开发注意事项
2018/05/26 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
python和php学习哪个更有发展
2020/06/17 Python
html5录音功能实战示例
2019/03/25 HTML / CSS
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
经典商业广告词
2014/03/13 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
如何写股份合作协议书
2014/09/11 职场文书
成本会计岗位职责
2015/02/03 职场文书
离婚起诉书范本
2015/05/18 职场文书
起诉书范文
2015/05/20 职场文书
代理词怎么写
2015/05/25 职场文书
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers