在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉。
因此,前后端相关人员先对PHP的json_encode函数原理有必要的了解是最重要的一个环节。
PHP中的array是个万能的数据结构,并不像其它语言根据需要的场景会定义很多约束性的数据类型来描述结构,所以PHP程序员是很难给客户端人员讲清楚返回的是什么结构的数据的。
也就变成明明是通过PHP的数组数据编码成json的,但输出值有时是数组、有时是对象的情况。
/* * 如果想生成一个json格式数组(vector)而 非对象格式(map),那么要数组下标满足一下情况 *1 必须是索引数组 *2 必须从0开始 *3 必须从小到大一次增大 中间不刻意跳跃,顺序不可变动 * */ $vector0 = [ 1, 2, 3, 4, 5 ]; echo json_encode($vector0)."<br/>"; $vector1 = [0 => 0, 1 => 1, 2 => 2]; echo json_encode($vector1)."<br/>" ; $map0 = [0 => 0, 3 => 1, 5 => 2]; echo json_encode($map0)."<br/>" ; $map1 = [ 1 => 1, 2 => 2]; echo json_encode($map1)."<br/>" ; $map2 = ['a'=>'a','b'=>'b','c'=>'c']; echo json_encode($map2)."<br/>" ;
其实在浏览器中JavaScript没有关联数组,因此json_encode()函数必须把关联数组转化为对象。(我猜:前端数组基本都是连续得,所以不连续得数组不能被转化成数组)。
如果要将数组转化为json对象,有两种:
$vector0 = [ 1, 2, 3, 4, 5 ]; echo json_encode($vector0,JSON_FORCE_OBJECT)."<br/>"; echo json_encode((object)$vector0)."<br/>";
将数组转为json对象:
//json => array $json_ob ='{"a":"a","b":"b","c":"c"}'; var_dump(json_decode($json_ob)); //是生成一个PHP对象: var_dump(json_decode($json_ob,true));// 加一个参数 TRUE ,转化为数组