1. 程式人生 > >Ajax資料傳遞的方式-伺服器->前端 JSON+XML

Ajax資料傳遞的方式-伺服器->前端 JSON+XML

一、JSON

1.js物件、陣列

javaScript Object Notation: JS物件表示法,以JS物件的方式表示字串

js用{}表示一個物件,用:賦值

var fb={
    yu:21,//用:賦值
    shu:33.
    ying:66
}

js的陣列物件:

var star=[
{height:21, gender:"女"},
{height:88, gender:"男"}
]

2.json物件

語法:

  • 用一對{}表示物件
  • 物件的屬性必須用""引起來,值是字串的也必須用""引起來
  • 屬性和值用:連線
  • 多對屬性之間用,隔開

3.json陣列

普通陣列:

'["楊冪","fbb"]'

物件陣列:

'[
    {"height":50,"weight":30},
    {"height":50,"weight":30}
]'

JSON檔案:檔案中全是字串,陣列的[]外邊不需要加引號,檔案中的資料,必須符合JSON格式的字串

[
	{"height":121,"weight":50,"gender":"女"},
	{"height":122,"weight":51,"gender":"女"},
	{"height":123,"weight":52,"gender":"女"}
]

4.將JSON檔案轉成JS的物件/陣列

方法一:eval()函式(不推薦)

var p = '{"name":"ll","age":23}';
var obj = eval("("+p+")");//必須用括號包起來

方法二:JSON.parse();將json檔案解析成JS的物件或者陣列

5.php中將陣列轉成JSON格式字串

一維、二維、關聯陣列等轉成JSON字串

json_encode($array);

服務端響應回的是json格式,需要增加響應訊息頭

header("Content-Type:application/json");

<?php
	#宣告一個數組並且初始化三個省份的資訊
header("Content-Type:application/json");
	$city = ["黑龍江","吉林","遼寧"];
	// #遍歷陣列拼接字串
	// $opts ="";
	// for($i=0;$i<count($city);$i++)
	// {
	// 	$opts.="<option value='$i'>$city[$i]</option>";
	// }
	// #將生成的字串響應給客戶端
	// echo $opts;

	#json檔案
	 echo json_encode($city);
?>

 案例:接收json檔案並輸出Ajax

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>關聯select+省份市級+json</title>
	<script src="common.js"></script>
	<script>
		function selPro()
		{
			var xhr = createXhr();
			//此處必須同步,必須載入完 才載入一下函式
			//確認載入完省份資訊之後,再載入市級資訊
			xhr.open("get","day03-test.php",false);
			xhr.onreadystatechange = function()
			{
				if (xhr.readyState==4&&xhr.status==200) 
				{
					//將json檔案 轉成陣列
					var province = JSON.parse(xhr.responseText);
					//遍歷迴圈
					var opt="";
					for (var i = 0; i < province.length; i++) 
					{
						//拼接的i不能使用字串""引起來
						opt+="<option"+" "+"value="+i+">"+province[i]+"</option>";
					}
					$("selProvince").innerHTML = opt;
				}
			}
			xhr.send(null);
		}
		//載入城市資訊
		function loadCity()
		{
			var xhr = createXhr();
			var index = $("selProvince").value;
			var url = "day03-test2.php?value="+index;
			xhr.open("get",url,true);
			xhr.onreadystatechange = function()
			{
				if (xhr.readyState==4&&xhr.status==200) 
				{
					var city1 = JSON.parse(xhr.responseText);

					var opt="";
					for (var i = 0; i < city1.length; i++) 
					{
						//拼接的i不能使用字串""引起來
						opt+="<option"+" "+"value="+i+">"+city1[i]+"</option>";
					}
					$("city").innerHTML = opt;
				}
			}
			xhr.send(null);
		}
		function pageLoad()
		{
			selPro();
			loadCity();
		}
	</script>
</head>
<body onload="pageLoad()">
	<select id="selProvince" onchange="loadCity()">
	</select>
	<select id="city"></select>
</body>
</html>

php檔案

<?php
	#宣告一個數組並且初始化三個省份的資訊
header("Content-Type:application/json");
	$city = ["黑龍江","吉林","遼寧"];
	// #遍歷陣列拼接字串
	// $opts ="";
	// for($i=0;$i<count($city);$i++)
	// {
	// 	$opts.="<option value='$i'>$city[$i]</option>";
	// }
	// #將生成的字串響應給客戶端
	// echo $opts;

	#json檔案
	 echo json_encode($city);
?>

二、XML

eXtensible Markup Lauguage : 可擴充套件的標記語言

XML的標記沒有預定義,需要自行定義,中文、英文均可

XML的宗旨是傳遞資料,不是現實資料

1.語法規範:

獨立的XML檔案,或者字串的形式

格式:<?xml version = "1.0" encoding ="utf-8"?>

標記語法:

  • xml的標記都是成對出現的
  • xml的標記,嚴格區分大小寫
  • 標記允許被巢狀
  • 每個標記可以自定義屬性,格式等同html,屬性必須使用“”包裹
  • 有且只有一個根元素
<?xml version="1.0" encoding="utf-8" ?>
<studentList>
	<student>
		<name>張三</name>
		<age>13</age>
		<gender>男</gender>
	</student>
	<student>
		<name>李四</name>
		<age>15</age>
		<gender>男</gender>
	</student>
	<student>
		<name>王五</name>
		<age>19</age>
		<gender>男</gender>
	</student>
</studentList>

2.使用Ajax請求XML檔案

①:四步:建立xhr,建立請求,設定回撥函式,傳送請求

第二步建立請求時:url改成xml結尾的檔案即可

第三步回撥函式使用 responseXML接收檔案

xhr.open("get","student.xml",true);

var res = xhr.responseXML;

②:解析XML檔案

elem.getElementsByTagName("標籤名");

函式返回一個類陣列,elem:表示的是取值範圍

var xmlDoc = xhrresponseXML;
var students = xmlDoc.getElementsByTagName("student");//返回一個類陣列
//列印輸出
for(var i=0;i<students.length;i++){
    var stu = students[i];
    var name = stu.getElementsByTagName("name")[0];
}

students及stu及name元素(未取下表[0]時)

所以 stu.getElementsByTagName("name")[0] 取得時name裡面的值

 ③:php檔案中,返回xml格式

按照xml的格式,拼接字串,響應給客戶端

同json格式一個,需要設定響應訊息頭:

header("Content-Type:application/xml");

 Ajax讀取XML檔案案例:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>XML請求資料</title>
	<script src="../day01-03/common.js"></script>
	<script>
		function loadStu()
		{
			var xhr = createXhr();
			xhr.open("get","student.xml",true);
			xhr.onreadystatechange=function()
			{
				if (xhr.readyState==4&&xhr.status==200) 
				{
				var res = xhr.responseXML;
				//返回的是類陣列
				var students=res.getElementsByTagName("student");
				console.log(students);
					for (var i = 0; i < students.length; i++) 
					{
						var stu = students[i];
						console.log(stu);
						console.log(stu.getElementsByTagName("name"));
						//name中儲存的是一個name元素集
						var name = stu.getElementsByTagName("name")[0];
						var age = stu.getElementsByTagName("age")[0];
						var gender = stu.getElementsByTagName("gender")[0];
						console.log("姓名:"+name.innerHTML);
						console.log("年齡:"+age.innerHTML);
						console.log("性別:"+gender.innerHTML);
					}
				}

			}
			xhr.send(null);
		}
	</script>
</head>
<body onload="loadStu()">
	
</body>
</html>
<?xml version="1.0" encoding="utf-8" ?>
<studentList>
	<student>
		<name>張三</name>
		<age>13</age>
		<gender>男</gender>
	</student>
	<student>
		<name>李四</name>
		<age>15</age>
		<gender>男</gender>
	</student>
	<student>
		<name>王五</name>
		<age>19</age>
		<gender>男</gender>
	</student>
</studentList>