PHP中将数组转变成Json
强大的PHP已经提供了内置函数:json_encode() 和 json_decode()。很容易理解,json_encode()就是将PHP数组转换成Json。相反,json_decode()就是将Json转换成PHP数组。
例如:
$array = array("name" => "Eric","age" => 23); echo json_encode($array);
程序将打印出 : {"name":"Eric","age":23}
再看下面例子
$array = array(0 => "Eric", 1 => 23); echo json_encode($array);
或者
$array = array('0' => "Eric", '1' => 23); echo json_encode($array);
程序都将打印出 :["Eric",23]
若是空数组,则返回[]
$array = array(); echo json_encode($array);
程序将打印出 :[]
这个格式,在特定要求,比如APP,ios android端接收到数据时,偶尔[],偶尔{},会导致程序崩溃
以上例子可以看出,如果PHP数组的键都是数字或者空数组,那么json_encode()返回一个数组形式的Json,如果PHP数组的键全是字符串。那么json_encode()就会返回一个对象形式的Json。两者在js中的调用是不同的。
事实上,只要在PHP数组的键中有一个字符串形式的键,那么json_encode()就会返回对象形式的Json
一个对象,而对象是不可能以数字作为属性名的
解决方法,在返回值的地方,统一加格式转化 强制转换 对象类型 JSON_FORCE_OBJECT
$return_info = json_encode($info,JSON_UNESCAPED_UNICODE);
JSON_UNESCAPED_UNICODE,Json不要编码Unicode,也就是不转义中文
改为:
$return_info = json_encode($info,JSON_UNESCAPED_UNICODE|JSON_FORCE_OBJECT);
这应该有一定的危险,所有的本该是数组返回的数据,会都转换成对象
因此,稳妥点的办法,单独处理,把需要转换对象数字数字或空数组,强制转换类型Object,一般如果用在对接时,比较好,不管在什么情况,接口永远输出对象,空数据及为{},那么就能统一接口的数据形式,
但是这个参数不能轻易用,因为一旦用起来,会导致本该是数组的返回格式[],也会变成{}
比如
return (Object)[];
这样统一返回格式,{},而不是返回[]
同一个问题参考:
https://my.oschina.net/osgrace/blog/860876
有关索引数组和关联数组
http://blog.csdn.net/vcx08/article/details/51613847
因此此问题关键核心在于,两种数组类型不一致,在特定的环境中,看具体需求json之后的结果,是数组,还是对象,最好统一格式,json操作,在接口中使用比较频繁,php和其他语言,互通时,需各位注意此问题
附赠一个,格式转化的函数,没经过测试哈...
php实现数组中索引关联数据转换成json对象的方法(请关注核心,该方法的框架环境自行忽略)
public static function encode(&$var) { return '{'.implode(',',self::encodeExcute($var)).'}'; } private static function encodeExcute(&$var) { $json = array(); switch (gettype($var)) { case 'array': foreach($var as $key=>$value) { if(is_array($value)) { $json[] = '"'.$key.'":{'.implode(',',self::encodeExcute($value)).'}'; //$json[$key] = self::encode($value); } elseif (is_object($value)) { $json[] = "\\"{$key}\\":".json_encode($value->attributes); } else { echo 'ERROR 未知类型,还未解析'; Yii::app()->end(); } } break; case 'object': break; } return $json; }