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 相关文章推荐
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
php判断电脑访问、手机访问的例子
May 10 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
PHP控制反转(IOC)和依赖注入(DI)
Mar 13 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
Django中通过定时任务触发页面静态化的处理方式
Aug 29 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 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
用缓存实现静态页面的测试
2006/12/06 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
js 调用百度分享功能
2017/02/27 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python 流程控制实例代码
2009/09/25 Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
python多线程抽象编程模型详解
2019/03/20 Python
python里运用私有属性和方法总结
2019/07/08 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
python 实现表情识别
2020/11/21 Python
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
环保建议书100字
2014/05/14 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
Python语言规范之Pylint的详细用法
2021/06/24 Python