引言
近日接触了jsonp技术,使用json进行系统端间的通信,发现了php_json的诸多偏角要点,在此统一归类。
为了代码与数据的维护与规范性,特意写下此文,以作分享
json_decode()
true
官方介绍
假若你直接将一个string塞给json_decode(),并且该string是一个大括号包裹的json字符串,那么解码出来的是一个stdClass对象,需要用->访问解码后的字段,如:
$json = json_decode('{"hilyjspeedx" : "csdn"}');
$hilyjspeedx = $json -> hilyjspeedx
->的访问方法,在SQL语句中将会抛出错误,非常不方便,所以需要:
json_decode($string,true)
加入true参数,使解码输出的是一个array,好使用 $json['hilyjspeedx']
方式访问json内的字段
json_encode()
JSON_FORCE_OBJECT
同样作为该函数的第二个参数,JSON_FORCE_OBJECT的配置对于json的编码显得尤为重要,尤其是在某一些字段为空或为索引数组的情况下
字段数组为空
在如下情况:
//情况1
json_encode([]);
//情况2
json_encode(["hi"=>"lyjspeedx","csdn"=>[]]);
可以发现,生成的json字符串是这样子的:
//情况1
'[]'
//情况2
'{"hi":"lyjspeedx","csdn":[]}'
可以看到,{}包裹下的json字符串,居然出现了[]符号,这在情况一更为突出,这是由json的结构定义决定的,但[]包裹的数组结构的json字符串,被其他逻辑处理时,特别是以关键符处理字符串的逻辑时,会出现未知的错误。
为了统一,即无论字段是否为空数组,都生成由{}包裹的字符串,应该在调用json_encode()时,在第二个参数写上JSON_FORCE_OBJECT强制编码为json对象,规避风险,使数据更便于维护,如 json_encode($array,JSON_FORCE_OBJECT)
索引数组
如果需要编码的数组为一个由下标0开始的纯索引数组,那么编码后的json字符串将不含key,这也是风险和异常的出处,如:
$json = json_encode([0=>'hi',1=>'csdn']);
$json = json_encode(['hi','csdn']);
编码后的$json奇葩的是:
'["hi","csdn"]'
可以发现并不包含json的key即字段名,同样,需要加上JSON_FORCE_OBJECT参数,可以使生成的json字符串更加规范,更易于差错和维护:
'{"0":"hi","1":"csdn"}'
强制为json对象,可以看到json字符串更加清晰和便于维护了