iOS 全栈攻城狮(PHP) —— Session 5

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程序员加深彼此认识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,192评论 4 61
  • 下了火车,搭上滴滴看看春城的市区。天气不错,空气清新。发现还有双层的City Boat。 看上去没有那么拥挤。昆明...
    将军府上阅读 286评论 0 4
  • 不经意间 拾起两节断枝桠 开满果子 如被红唇染过的豌豆洒满枝子 我把它放在桌上搁置已久的 空杯里 数十天了 那果子...
    莘茹声音疗愈顾问阅读 296评论 4 21
  • 幢幢楼影压满池 排排屋舍鸡犬吠 满地残红犹带泪 昨夜雨重谁人知 记于三亚海棠湾酒店。马路为界,一边是富丽堂皇、气势...
    牧羊云2阅读 296评论 0 0