1. 程式人生 > >Web開發中常見的資料結構(CSV,XML,JSON)

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,JSON裡可以體現出資料的關聯性

總結:如果你的資料不會頻繁新增刪除列,也不在乎關聯性,那麼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樹結構來說,客戶端處理的程式碼要簡單多了。

總結:如果你需要頻繁變換資料列,需要key-value結構,又不需要XML很多額外的功能。那麼JSON格式以其輕巧靈活的結構應該成為首選(事實也正是如此)