Web開發中常見的資料結構(CSV,XML,JSON)
Web開發中常見的資料結構(據我所知)有3種:CSV,XML,JSON
這裡將介紹這3種方式的優劣,有助於你根據需求選取合適的方式來管理你的資料。
(如果對下面程式碼中回撥函式等不瞭解,可以先參照博文【Ajax技術介紹】:
http://blog.csdn.net/hongse_zxl/article/details/39552399)
第一種:CSV
CSV是純文字檔案,和txt的區別僅在於字尾名不同(當然根據普世規則,CSV內資料將用逗號隔開)。因此在Web傳輸中將有最快的傳輸速度。
在Web伺服器端的PHP指令碼中將資料用逗號隔開,通過echo傳給客戶端JavaScript指令碼:
$registerInfo = array ( $_REQUEST['username'] => $_REQUEST['username'] . "," . $_REQUEST['email'] . "," . "1982/01/23,Female" ); echo $registerInfo[$_REQUEST['username']];
客戶端JavaScript指令碼中的回撥函式裡,通過解析逗號,來獲得資料:
function registrationProcessed() { if (registerRequest.readyState == 4 && registerRequest.status == 200) { var response = request.responseText; //獲取Web伺服器端傳送過來的資料 var infoDetails = response.split(","); //解析逗號 //根據PHP端定義,結合陣列index就能獲得各項資料 //infoDetails[0]為username //infoDetails[1]為email //infoDetails[2]為birthday //infoDetails[3]為gender } }
根據程式碼就能看出CSV的缺點:
1.伺服器端在中間插入刪除資料時要小心,頁面很可能會錯位(※1)
2.CSV裡的資料無法看出關聯性(※2)
※1:舉例,如果伺服器端在中間(如index 2處)而非尾端插入新列。客戶端程式碼除了新增處理新資料的程式碼外,index 2以後的資料都必須修改index號。這不符合軟體的開閉原則(對擴充套件開發,對修改封閉)
即使你保證絕不會在中間插入新列,保證新列永遠插入到末尾,你也無法保證刪除資料列永遠只刪末尾列(如果你刪除了中間某列資料,可憐的客戶端程式設計師將修改該列之後的所有列的index,為它們加1)
※2:即使你保證永遠只在末尾插入新列,並保證永遠不刪除舊列
總結:如果你的資料不會頻繁新增刪除列,也不在乎關聯性,那麼CSV以其簡單易懂的格式,和最快的傳輸效能,使它成為你組織資料的首選。
第二種:XML
業界標準的資料結構。資料由key-value組成,克服了CSV的缺點。頁面收到XML資料後可用DOM方法來獲取資料。
在Web伺服器端的PHP指令碼:
$registerInfo = array (
$_REQUEST['username'] =>
"<?xml version=\"1.0\"?>
<pre name="code" class="php"><item id=\"" . $_REQUEST['username'] . "\">
<name>" . $_REQUEST['username'] . "</name>
<email>" . $_REQUEST['email'] . "</email>
<birthday>1982/01/23</birthday>
<gender>Female</gender>
<contact> #新增了CSV裡沒有的聯絡方式,最多可以設定3個電話號碼
<phone>158000000</phone>
<phone></phone>
<phone>159000000</phone>
</contact>
</item>");
header("Content-Type: text/xml");
echo $registerInfo[$_REQUEST['username']];
客戶端JavaScript指令碼中的回撥函式裡,可以直接通過key來獲得資料:
function registrationProcessed() {
if (registerRequest.readyState == 4 && registerRequest.status == 200) {
var responseDoc = request.responseXML;
//根據PHP端定義,通過DOM直接用key來獲得資料
//responseDoc.getElementsByTagName("name")[0].firstChild.nodeValue為username
//responseDoc.getElementsByTagName("email")[0].firstChild.nodeValue為email
//responseDoc.getElementsByTagName("birthday")[0].firstChild.nodeValue為birthday
//responseDoc.getElementsByTagName("gender")[0].firstChild.nodeValue為gender
//responseDoc.getElementsByTagName("phone")為電話組,通過迴圈可以獲得各電話號碼
}
}
可以看出XML格式,採用key-value結構組織資料後,不必再像CSV那樣顧慮新增刪除資料列的問題。而且資料間(如電話phone)也有了關聯性
總結:XML幾乎是一種完美的資料結構,還有如XSD來規範XML文件結構等輔助功能。如果非要找些缺點,可能就是效能太多,對初學者來說不易上手。
第三種:JSON
CSV不夠靈活,而XML又太複雜。JSON既有CSV文字特性,因此它高效,又有XML的結構,因此易讀可維護。
JSON會建立一個標準的JavaScript物件,它看上去更像是一個結合了資料和功能的業務物件,而不是一個無型別的XML DOM樹。
在Web伺服器端的PHP指令碼:require_once('JSON.php'); #在PHP裡處理JSON格式的話,可以先從json.org官網上下載針對php的指令碼,裡面定義了各種處理JSON的函式
$json = new Services_JSON();
$personUser = array(
'name' => $_REQUEST['username'],
'email' => $_REQUEST['email'],
'birthday' => "1982/01/23",
'gender' => "Female",
'contact' => array("158000000","159000000","")
);
$person = $registerInfo[$_REQUEST['username']];
$output = $json->encode($person);
print($output);
客戶端JavaScript指令碼中的回撥函式裡,可以直接通過key來獲得資料:function registrationProcessed() {
if (registerRequest.readyState == 4 && registerRequest.status == 200) {
var registerInfos = eval('(' + request.responseText + ')'); //注意eval是不安全的,應用stringify()和parse()替換,這裡用eval只是為了方便
//根據PHP端定義,通過JavaScript物件直接用key來獲得資料
//registerInfos['name']為username
//registerInfos['email']為email
//registerInfos['birthday']為birthday
//registerInfos['gender']為gender
//registerInfos['contact']為電話組,通過迴圈可以獲得各電話號碼
}
}
JSON格式被轉換成JavaScript物件後,相比XML的DOM樹結構來說,客戶端處理的程式碼要簡單多了。