JSON
大部分客户端和服务器端的数据交换协议都是JSON,JSON有很多优点,它兼容性强、使用方便、解析效率不低。
PHP 中 JSON 的编解码
JSON 在 PHP 中的使用非常简单,以下是一个 PHP 生成 JSON 字符串的例子。
<?php
$arr = [1, 2, 3];
echo json_encode($arr);
我们定义了一个数组,然后使用 json_encode($arr)
将数组编码为 JSON 字符串,然后直接输出。
同样的,使用 PHP 解析 JSON 也非常方便。
<?php
$json_str = '{"name": "Pony"}';
$json_arr = json_decode($json_str, true);
echo $json_arr["name"];// print Pony
之所以易用,是因为PHP的代码同步执行以及PHP对类型的不敏感, 为什么这样说,接下去看吧。
字典、数组类型错乱
JSON和PHP绝对不是一对好组合,PHP 会将弱类型的所有缺点带进 JSON。
正如大家所知,PHP 对数组、字典并没有严格地区分。如果某一天,你与服务器端约定一个字段应该返回数组,但是却异常地返回了字典。那可能是下面这种情况。
<?php
$arr = [0, 1, 2, 3, 4];
echo json_encode($arr); //[0,1,2,3,4]
unset($arr[1]);
echo json_encode($arr); //{"0":0,"2":2,"3":3,"4":4}
这个时候,你可能在心里暗暗地骂娘……
但是,客户端真的需要多留意这些地方,多作判断。因为,你根本不知道 PHP 程序员的代码习惯。
字符串、数字类型错乱
PHP 对数字、字符串也是不敏感的…… 因此,如果你与 PHP API 约定一个字段为字符串,那它很有可能返回一个数字给你,就像下面这样。
<?php
$a = 1;
$b = "2";
$c = $a + b;
$arr = ["str"=> $c];
echo json_encode($arr); // print {"str":1}
最保险地做法是在输出JSON前,对变量进行类型强制转换。
<?php
$a = 1;
$b = "2";
$c = $a + b;
$arr = ["str"=> (string)$c];
echo json_encode($arr); // print {"str":"1"}
但是,你仍然不能保证每个程序员都这样做,更糟糕地是,从数据库中取出的数据,类型完全不能确定!
可能返回一个 Null
假如一个变量在中途丢失了,或者没有被初始化,然后就塞入一个数组、字典,PHP并不会报错,而是输出一个 Null 到 JSON中。
<?php
$arr = ["str"=> $c];
echo json_encode($arr);
这,就是所有iOS程序员的噩梦…… 作为iOS猿,你只能多作判断。 作为一个PHP程序员,我仍然建议对每个输出变量进行强转,就像下面的代码,则不会出现问题。
<?php
$arr = ["str"=> (string)$c];
echo json_encode($arr);
结语
对于PHP的JSON编解码,并没有什么难度。
但是,一个优秀的PHP程序员,应该认识到PHP的局限性,并且对接口的质量要有更深刻的认识。
同样的,一个合格的iOS程序员,理应对外部的输入作更多的判断,这样才能保证应用不因接口格式错误而直接崩溃。
愿此文能让iOS程序员和PHP程序员加深彼此认识。