/**
*包括json基礎知識,解析數據、ajax基礎、xml解析數據相關原理
*/php
json 教程html
·json概念
JSON: JavaScript Object Notation(JavaScript 對象表示法)java
JSON 是存儲和交換文本信息的語法。相似 XML。node
JSON 比 XML 更小、更快,更易解析。
json是輕量級的文本數據交換格式
json支持多種語言
json轉換爲JavaScript對象,因爲json文本格式在語法上與建立JavaScript對象的代碼相同,無需解析器,
JavaScript程序可以使用內建的eval()函數,用json數據生成原生的JavaScript對象
對比xml:
相同:純文本,具備層級結構(值中存在值),經過JavaScript解析,使用AJAX進行傳輸數據
不一樣:沒有結束標籤,更短,讀寫速度快,使用內建的JavaScript eval()方法 解析,使用數組
不使用保留字
對於AJAX應用 程序來講,json更快更易使用:
使用xml:讀取xml文檔,使用xml DOM循環遍歷文檔,讀取值並存儲在變量中
使用Json:讀取json字符串,用eval()處理json字符串jquery
·json的數據類型
原始數據類型:數字(整形、浮點型、定點數),字符和字符串、布爾類型
特殊數據類型:對象、數組、null
複合數據類型對象的數據結構能夠被解構爲原始數據類型android
·json語法
是JavaScript語法的子集
數據在名稱/值對中 "name":"cainiao"
數據由逗號分隔
大括號保存對象 { "name":"菜鳥教程" , "url":"www.runoob.com" }
中括號保存數組 {
"sites": [
{ "name":"菜鳥教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}ajax
JSON 文件的文件類型是 ".json"
JSON 文本的 MIME 類型是 "application/json"數據庫
·json對象
key 必須是字符串,value 能夠是合法的 JSON 數據類型(字符串, 數字, 對象, 數組, 布爾值或 null)。json
key 和 value 中使用冒號(:)分割。數組
每一個 key/value 對使用逗號(,)分割。
訪問對象值
var myObj, x;
myObj = { "name":"runoob", "alexa":10000, "site":null };
x = myObj.name;
循環對象
var myObj = { "name":"runoob", "alexa":10000, "site":null };
for (x in myObj) {
document.getElementById("demo").innerHTML += myObj[x] + "<br>";
}
修改值
myObj.sites.site1 = "www.google.com";
myObj.sites["site1"] = "www.google.com";
刪除值
delete myObj.sites.site1;
delete myObj.sites["site1"];
·json數組
[ "Google", "Runoob", "Taobao" ]
JSON 數組在中括號中書寫。
JSON 中數組值必須是合法的 JSON 數據類型(字符串, 數字, 對象, 數組, 布爾值或 null)。
JavaScript 中,數組值能夠是以上的 JSON 數據類型,也能夠是 JavaScript 的表達式,包括函數,日期,及 undefined。
·json對象中的數組
{
"name":"網站",
"num":3,
"sites":[ "Google", "Runoob", "Taobao" ]
}
訪問數組:x = myobj.sites[0];
嵌套json對象中的數組能夠包含一個數組或者一個json對象
json一般用於與服務端交換數據json.parse將數據轉換爲JavaScript對象
JSON.parse(text[, reviver])
參數說明:
text:必需, 一個有效的 JSON 字符串。
reviver: 可選,一個轉換結果的函數, 將爲對象的每一個成員調用此函數。
使用json.parse()解析數據,解析前的字符串要是標準的json格式
var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
以下所示:解析並使用json數據
<p id="demo"></p>
<script>
var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
document.getElementById("demo").innerHTML = obj.name + ":" + obj.site;
</script>
·AJAX詳情
使用AJAX從服務器請求json數據,並解析爲JavaScript對象
XMLHttpRequest對象能夠不在向服務器提交整個頁面的狀況下,實現局部更新網頁
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
myObj = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myObj.name;
}
};
//向服務器發送請求
xmlhttp.open("GET", "/try/ajax/json_demo.txt", true);
xmlhttp.send();
究竟是使用GET仍是POST:
get更簡單也更快
然而有些狀況使用POST:
沒法使用緩存文件(更新服務器上的文件或數據庫)
向服務器發送大量數據(POST 沒有數據量限制)
發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
若是須要像 HTML 表單那樣 POST 數據,請使用 setRequestHeader() 來添加 HTTP 頭。而後在 send() 方法中規定您但願發送的數據:
xmlhttp.open("POST","ajax_test.html",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Henry&lname=Ford");
XMLHttpRequest對象的responseText或responseXML屬性是對服務器響應處理的屬性
若是服務器響應的並不是xml,使用responseText屬性
document.getElementById("nyDiv").innerHTML = xmlhttp.responseText;
若是服務器響應的是xml,使用responseXML屬性
xmlDoc = xmlhttp.responseXML;
txt ="";
x = xmlDoc.getElementByTagName("Artist");
for(i =0;i<x.length;i++){
txt = txt + x[i].childNodes[0].nodeValue+"<br>"
}
document.getElementById("myDiv").innerHTML = txt;
當發送一個請求後,客戶端須要肯定何時完成這個請求,提供了onreadystatechange事件
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
myArr = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myArr[1];
}
};
Ajax與數據庫進行動態通訊的原理:這裏能夠進一步研究
實例:
1.基礎的Ajax:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/statics/demosource/ajax_info.txt",true);
xmlhttp.send();
}
</script>
</head>
<body>
<div id="myDiv"><h2>使用 AJAX 修改該文本內容</h2></div>
<button type="button" onclick="loadXMLDoc()">修改內容</button>
</body>
</html>
2.Ajax加載xml:
3.Ajax進行一次HEAD請求:
document.getElementById('p1').innerHTML=xmlhttp.getAllResponseHeaders();
4.Ajax進行一次指定的HEAD請求:
document.getElementById('p1').innerHTML="Last modified: " + xmlhttp.getResponseHeader('Last-Modified');
5.Ajax從數據庫返回數據:
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/statics/demosource/getcustomer.php?q="+str,true);
6.Ajax從xml返回數據:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function loadXMLDoc(url)
{
var xmlhttp;
var txt,x,xx,i;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
txt="<table border='1'><tr><th>Title</th><th>Artist</th></tr>";
x=xmlhttp.responseXML.documentElement.getElementsByTagName("CD");
for (i=0;i<x.length;i++)
{
txt=txt + "<tr>";
xx=x[i].getElementsByTagName("TITLE");
{
try
{
txt=txt + "<td>" + xx[0].firstChild.nodeValue + "</td>";
}
catch (er)
{
txt=txt + "<td> </td>";
}
}
xx=x[i].getElementsByTagName("ARTIST");
{
try
{
txt=txt + "<td>" + xx[0].firstChild.nodeValue + "</td>";
}
catch (er)
{
txt=txt + "<td> </td>";
}
}
txt=txt + "</tr>";
}
txt=txt + "</table>";
document.getElementById('txtCDInfo').innerHTML=txt;
}
}
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
</script>
</head>
<body>
<div id="txtCDInfo">
<button onclick="loadXMLDoc('/statics/demosource/cd_catalog.xml')">Get CD info</button>
</div>
</body>
</html>
7.用callback檢索數據:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
var xmlhttp;
function loadXMLDoc(url,cfunc)
{
if (window.XMLHttpRequest)
{// IE7+, Firefox, Chrome, Opera, Safari 代碼
xmlhttp=new XMLHttpRequest();
}
else
{// IE6, IE5 代碼
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
function myFunction()
{
loadXMLDoc("/statics/demosource/ajax_info.txt",function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
});
}
</script>
</head>
<body>
<div id="myDiv"><h2>使用 AJAX 修改文本內容</h2></div>
<button type="button" onclick="myFunction()">修改內容</button>
</body>
</html>
從服務端接收數組的json數據,json.parse會將其轉換爲JavaScript數組
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
myArr = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myArr[1];
}
};
xmlhttp.open("GET", "/try/ajax/json_demo_array.txt", true);
xmlhttp.send();
異常:從服務器獲得數據
解析數據
JSON 不能存儲 Date 對象。
若是你須要存儲 Date 對象,須要將其轉換爲字符串。
以後再將字符串轉換爲 Date 對象。
var text = '{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}';
var obj = JSON.parse(text);
obj.initDate = new Date(obj.initDate);
document.getElementById("demo").innerHTML = obj.name + "建立日期: " + obj.initDate;
介紹一種android app中時間戳的轉換方式
GsonBuilder builder = new GsonBuilder();
// Register an adapter to manage the date types as long values
builder.registerTypeAdapter(Timestamp.class, new JsonDeserializer<Timestamp>() {
public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new Timestamp(json.getAsJsonPrimitive().getAsLong());
}
});
Gson gson = builder.create();
//循環遍歷JsonArray
for(JsonElement info:listJson){
//使用Gson,直接轉成Bean對象
ConsumeDetail msgInfo = gson.fromJson(info,ConsumeDetail.class);
list.add(msgInfo);
}
解析函數
JSON 不容許包含函數,但你能夠將函數做爲字符串存儲,以後再將字符串轉換爲函數。
var text = '{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}';
var obj = JSON.parse(text);
obj.alexa = eval("(" + obj.alexa + ")");//讀取數據
document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();
不建議在 JSON 中使用函數。
·JSON.stringify()
JSON 一般用於與服務端交換數據。
在向服務器發送數據時通常是字符串。
咱們可使用 JSON.stringify() 方法將 JavaScript 對象轉換爲字符串。
var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"};
var myJSON = JSON.stringify(obj);
document.getElementById("demo").innerHTML = myJSON;
咱們也能夠將 JavaScript 數組轉換爲 JSON 字符串:
var arr = [ "Google", "Runoob", "Taobao", "Facebook" ];
var myJSON = JSON.stringify(arr);
document.getElementById("demo").innerHTML = myJSON;
異常:傳遞數據給服務器
解析數據
JSON 不能存儲 Date 對象。
JSON.stringify() 會將全部日期轉換爲字符串。
var obj = { "name":"Runoob", "initDate":new Date(), "site":"www.runoob.com"};
var myJSON = JSON.stringify(obj);
document.getElementById("demo").innerHTML = myJSON;
解析函數
JSON 不容許包含函數,JSON.stringify() 會刪除 JavaScript 對象的函數,包括 key 和 value。咱們能夠在執行 JSON.stringify() 函數前將函數轉換爲字符串來避免以上問題的發生:
var obj = { "name":"Runoob", "alexa":function () {return 10000;}, "site":"www.runoob.com"};
obj.alexa = obj.alexa.toString();
var myJSON = JSON.stringify(obj);
document.getElementById("demo").innerHTML = myJSON;
XMl教程
·解析xml文檔,詳見 java學習心得.md第1360行
xml和json優缺點
(1).XML的優缺點
<1>.XML的優勢
A.格式統一,符合標準;
B.容易與其餘系統進行遠程交互,數據共享比較方便。
<2>.XML的缺點
A.XML文件龐大,文件格式複雜,傳輸佔帶寬;
B.服務器端和客戶端都須要花費大量代碼來解析XML,致使服務器端和客戶端代碼變得異常複雜且不易維護;
C.客戶端不一樣瀏覽器之間解析XML的方式不一致,須要重複編寫不少代碼;
D.服務器端和客戶端解析XML花費較多的資源和時間。
(2).JSON的優缺點
<1>.JSON的優勢:
A.數據格式比較簡單,易於讀寫,格式都是壓縮的,佔用帶寬小;
B.易於解析,客戶端JavaScript能夠簡單的經過eval()進行JSON數據的讀取;
C.支持多種語言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服務器端語言,便於服務器端的解析;
D.在PHP世界,已經有PHP-JSON和JSON-PHP出現了,偏於PHP序列化後的程序直接調用,PHP服務器端的對象、數組等能直接生成JSON格式,便於客戶端的訪問提取;
E.由於JSON格式能直接爲服務器端代碼使用,大大簡化了服務器端和客戶端的代碼開發量,且完成任務不變,而且易於維護。
<2>.JSON的缺點
A.沒有XML格式這麼推廣的深刻人心和喜用普遍,沒有XML那麼通用性;
B.JSON格式目前在Web Service中推廣還屬於初級階段。
兩者對比分析:(json會佔據將來數據交換格式的地位)
(1).可讀性方面。
JSON和XML的數據可讀性基本相同,JSON和XML的可讀性可謂不相上下,一邊是建議的語法,一邊是規範的標籤形式,XML可讀性較好些。
(2).可擴展性方面。
XML天生有很好的擴展性,JSON固然也有,沒有什麼是XML能擴展,JSON不能的。
(3).編碼難度方面。
XML有豐富的編碼工具,好比Dom4j、JDom等,JSON也有json.org提供的工具,可是JSON的編碼明顯比XML容易許多,即便不借助工具也能寫出JSON的代碼,但是要寫好XML就不太容易了。
(4).解碼難度方面。
XML的解析得考慮子節點父節點,讓人頭昏眼花,而JSON的解析難度幾乎爲0。這一點XML輸的真是沒話說。
(5).流行度方面。
XML已經被業界普遍的使用,而JSON纔剛剛開始,可是在Ajax這個特定的領域,將來的發展必定是XML讓位於JSON。到時Ajax應該變成Ajaj(Asynchronous Javascript and JSON)了。
(6).解析手段方面。
JSON和XML一樣擁有豐富的解析手段。
(7).數據體積方面。
JSON相對於XML來說,數據的體積小,傳遞的速度更快些。
(8).數據交互方面。
JSON與JavaScript的交互更加方便,更容易解析處理,更好的數據交互。
(9).數據描述方面。
JSON對數據的描述性比XML較差。
(10).傳輸速度方面。
JSON的速度要遠遠快於XML。
XML比較適合於標記文檔,而JSON卻更適於進行數據交換處理。
jquery經過ajax解析json數據
固然不一樣的json返回的數據解析方式也不同:
大概有如下幾種:
1.json數據 :{"id":1,"title":"耳溫槍","start":"2017-08-05 05:00:00","end":"2017-07-28 17:00:00","allDay":0,"color":"#360","date":"2017:7:27"}
解析方法:
該json自己就是一個json對象,因此能夠直接獲取:
var Id = json.id;
var title = json.title;
var start = json.start;
var end = json.end;
2.json數據:[{"id":1,"title":"耳溫槍","start":"2017-08-05 05:00:00","end":"2017-07-28 17:00:00","allDay":0,"color":"#360","date":"2017:7:27"}]
解析方法:
$.each(json, function(i, item) {
//循環獲取數據
var Id = item.id;
var title = item.title;
var start = item.start;
var end = item.end;
});
3. json 數據:
{"first":[{"id":1,"title":"耳溫槍","start":"2017-08-05 05:00:00","end":"2017-07-28 17:00:00","allDay":0,"color":"#360","date":"2017:7:27"}]}
解析方法:
$.each(json.first, function(i, item) {
//循環獲取數據
var Id = item.id;
var title = item.title;
var start = item.start;
var end = item.end;
});