iOS 全棧攻城獅(PHP) —— Session 5

JSON

大部分客戶端和服務(wù)器端的數(shù)據(jù)交換協(xié)議都是JSON,JSON有很多優(yōu)點(diǎn),它兼容性強(qiáng)、使用方便、解析效率不低。

PHP 中 JSON 的編解碼

JSON 在 PHP 中的使用非常簡(jiǎn)單,以下是一個(gè) PHP 生成 JSON 字符串的例子。

<?php
$arr = [1, 2, 3];
echo json_encode($arr);

我們定義了一個(gè)數(shù)組,然后使用 json_encode($arr) 將數(shù)組編碼為 JSON 字符串,然后直接輸出。

同樣的,使用 PHP 解析 JSON 也非常方便。

<?php
$json_str = '{"name": "Pony"}';
$json_arr = json_decode($json_str, true);
echo $json_arr["name"];// print Pony

之所以易用,是因?yàn)镻HP的代碼同步執(zhí)行以及PHP對(duì)類(lèi)型的不敏感, 為什么這樣說(shuō),接下去看吧。

字典、數(shù)組類(lèi)型錯(cuò)亂

JSON和PHP絕對(duì)不是一對(duì)好組合,PHP 會(huì)將弱類(lèi)型的所有缺點(diǎn)帶進(jìn) JSON。

正如大家所知,PHP 對(duì)數(shù)組、字典并沒(méi)有嚴(yán)格地區(qū)分。如果某一天,你與服務(wù)器端約定一個(gè)字段應(yīng)該返回?cái)?shù)組,但是卻異常地返回了字典。那可能是下面這種情況。

<?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}

這個(gè)時(shí)候,你可能在心里暗暗地罵娘……
但是,客戶端真的需要多留意這些地方,多作判斷。因?yàn)椋愀静恢?PHP 程序員的代碼習(xí)慣。

字符串、數(shù)字類(lèi)型錯(cuò)亂

PHP 對(duì)數(shù)字、字符串也是不敏感的…… 因此,如果你與 PHP API 約定一個(gè)字段為字符串,那它很有可能返回一個(gè)數(shù)字給你,就像下面這樣。

<?php
$a = 1;
$b = "2";
$c = $a + b;
$arr = ["str"=> $c];
echo json_encode($arr); // print {"str":1}

最保險(xiǎn)地做法是在輸出JSON前,對(duì)變量進(jìn)行類(lèi)型強(qiáng)制轉(zhuǎn)換。

<?php
$a = 1;
$b = "2";
$c = $a + b;
$arr = ["str"=> (string)$c];
echo json_encode($arr); // print {"str":"1"}

但是,你仍然不能保證每個(gè)程序員都這樣做,更糟糕地是,從數(shù)據(jù)庫(kù)中取出的數(shù)據(jù),類(lèi)型完全不能確定!

可能返回一個(gè) Null

假如一個(gè)變量在中途丟失了,或者沒(méi)有被初始化,然后就塞入一個(gè)數(shù)組、字典,PHP并不會(huì)報(bào)錯(cuò),而是輸出一個(gè) Null 到 JSON中。

<?php
$arr = ["str"=> $c];
echo json_encode($arr);

這,就是所有iOS程序員的噩夢(mèng)…… 作為iOS猿,你只能多作判斷。 作為一個(gè)PHP程序員,我仍然建議對(duì)每個(gè)輸出變量進(jìn)行強(qiáng)轉(zhuǎn),就像下面的代碼,則不會(huì)出現(xiàn)問(wèn)題。

<?php
$arr = ["str"=> (string)$c];
echo json_encode($arr);

結(jié)語(yǔ)

對(duì)于PHP的JSON編解碼,并沒(méi)有什么難度。
但是,一個(gè)優(yōu)秀的PHP程序員,應(yīng)該認(rèn)識(shí)到PHP的局限性,并且對(duì)接口的質(zhì)量要有更深刻的認(rèn)識(shí)。
同樣的,一個(gè)合格的iOS程序員,理應(yīng)對(duì)外部的輸入作更多的判斷,這樣才能保證應(yīng)用不因接口格式錯(cuò)誤而直接崩潰。

愿此文能讓iOS程序員和PHP程序員加深彼此認(rèn)識(shí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,881評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,200評(píng)論 4 61
  • 下了火車(chē),搭上滴滴看看春城的市區(qū)。天氣不錯(cuò),空氣清新。發(fā)現(xiàn)還有雙層的City Boat。 看上去沒(méi)有那么擁擠。昆明...
    將軍府上閱讀 286評(píng)論 0 4
  • 不經(jīng)意間 拾起兩節(jié)斷枝椏 開(kāi)滿果子 如被紅唇染過(guò)的豌豆灑滿枝子 我把它放在桌上擱置已久的 空杯里 數(shù)十天了 那果子...
    莘茹聲音療愈顧問(wèn)閱讀 297評(píng)論 4 21
  • 幢幢樓影壓滿池 排排屋舍雞犬吠 滿地殘紅猶帶淚 昨夜雨重誰(shuí)人知 記于三亞海棠灣酒店。馬路為界,一邊是富麗堂皇、氣勢(shì)...
    牧羊云2閱讀 298評(píng)論 0 0