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ì)類型的不敏感, 為什么這樣說,接下去看吧。
字典、數(shù)組類型錯(cuò)亂
JSON和PHP絕對(duì)不是一對(duì)好組合,PHP 會(huì)將弱類型的所有缺點(diǎn)帶進(jìn) JSON。
正如大家所知,PHP 對(duì)數(shù)組、字典并沒有嚴(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ù)字類型錯(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)行類型強(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ù)庫中取出的數(shù)據(jù),類型完全不能確定!
可能返回一個(gè) Null
假如一個(gè)變量在中途丟失了,或者沒有被初始化,然后就塞入一個(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)問題。
<?php
$arr = ["str"=> (string)$c];
echo json_encode($arr);
結(jié)語
對(duì)于PHP的JSON編解碼,并沒有什么難度。
但是,一個(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í)。