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的无限分类实现想法~
Jan 02 PHP
php 前一天或后一天的日期
Jun 28 PHP
php实现利用phpexcel导出数据
Aug 24 PHP
php中将数组转成字符串并保存到数据库中的函数代码
Sep 29 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
Jan 31 PHP
PHP的preg_match匹配字符串长度问题解决方法
May 03 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
PHP动态柱状图实现方法
Mar 30 PHP
php代码检查代理ip的有效性
Aug 19 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 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无限分类的深入理解
2013/06/02 PHP
PHP中的替代语法简介
2014/08/22 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
2016/12/10 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
理解javascript闭包
2015/12/15 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
Python递归函数定义与用法示例
2017/06/02 Python
对Python 语音识别框架详解
2018/12/24 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
python函数的作用域及关键字详解
2019/08/20 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
Python内置类型性能分析过程实例
2020/01/29 Python
学python需要去培训机构吗
2020/07/01 Python
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
应聘护士自荐信
2013/10/21 职场文书
计算机系本科生求职信
2014/05/31 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
python模板入门教程之flask Jinja
2022/04/11 Python
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers