PHP JSON的那些坑

6 篇文章 0 订阅
2 篇文章 0 订阅

引言

近日接触了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字符串更加清晰和便于维护了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值