關於JSON的簡介 和基礎javascript
* | JSON 使用 Javascript語法來描述數據對象,可是 JSON 仍然獨立於語言和平臺。JSON 解析器和 JSON 庫支持許多不一樣的編程語言。 目前很是多的動態(PHP,JSP,.NET)編程語言都支持JSON。 |
JSON 文本格式在語法上與建立 JavaScript 對象的代碼相同。php
因爲這種類似性,無需解析器,JavaScript 程序可以使用內建的 eval() 函數,用 JSON 數據來生成原生的 JavaScript 對象。html
對於 AJAX 應用程序來講,JSON 比 XML 更快更易使用:java
JSON語法jquery
JSON 語法是 JavaScript 語法的子集。git
JSON 語法是 JavaScript 對象表示法語法的子集。github
JSON 數據的書寫格式是:名稱/值對。web
名稱/值對包括字段名稱(在雙引號中),後面寫一個冒號,而後是值:ajax
"name" : "菜鳥教程"
這很容易理解,等價於這條 JavaScript 語句:編程
name = "菜鳥教程"
JSON 值能夠是:
JSON 數字能夠是整型或者浮點型:
{ "age":30 }
JSON 對象在大括號({})中書寫:
對象能夠包含多個名稱/值對:
{ "name":"菜鳥教程" , "url":"www.runoob.com" }
這一點也容易理解,與這條 JavaScript 語句等價:
name = "菜鳥教程" url = "www.runoob.com"
JSON 數組在中括號中書寫:
數組可包含多個對象:
{ "sites": [ { "name":"菜鳥教程" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ] }
在上面的例子中,對象 "sites" 是包含三個對象的數組。每一個對象表明一條關於某個網站(name、url)的記錄。
JSON 布爾值能夠是 true 或者 false:
{ "flag":true }
JSON 能夠設置 null 值:
{ "runoob":null }
由於 JSON 使用 JavaScript 語法,因此無需額外的軟件就能處理 JavaScript 中的 JSON。
經過 JavaScript,您能夠建立一個對象數組,並像這樣進行賦值:
var sites = [ { "name":"runoob" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ];
能夠像這樣訪問 JavaScript 對象數組中的第一項(索引從 0 開始):
sites[0].name;
返回的內容是:
runoob
能夠像這樣修改數據:
sites[0].name="菜鳥教程";
{ "name":"runoob", "alexa":10000, "site":null }
JSON 對象使用在大括號({})中書寫。
對象能夠包含多個 key/value(鍵/值)對。
key 必須是字符串,value 能夠是合法的 JSON 數據類型(字符串, 數字, 對象, 數組, 布爾值或 null)。
key 和 value 中使用冒號(:)分割。
每一個 key/value 對使用逗號(,)分割。
你可使用點號(.)來訪問對象的值:
var myObj, x; myObj = { "name":"runoob", "alexa":10000, "site":null }; x = myObj.name;
你也可使用中括號([])來訪問對象的值:
var myObj, x; myObj = myObj = { "name":"runoob", "alexa":10000, "site":null }; x = myObj["name"];
你可使用 for-in 來循環對象的屬性:
var myObj = { "name":"runoob", "alexa":10000, "site":null }; for (x in myObj) { document.getElementById("demo").innerHTML += x + "<br>"; }
在 for-in 循環對象的屬性時,使用中括號([])來訪問屬性的值:
var myObj = { "name":"runoob", "alexa":10000, "site":null }; for (x in myObj) { document.getElementById("demo").innerHTML += myObj[x] + "<br>"; }
JSON 對象中能夠包含另一個 JSON 對象:
myObj = { "name":"runoob", "alexa":10000, "sites": { "site1":"www.runoob.com", "site2":"m.runoob.com", "site3":"c.runoob.com" } }
你可使用點號(.)或者中括號([])來訪問嵌套的 JSON 對象。
x = myObj.sites.site1; // 或者 x = myObj.sites["site1"];
你可使用點號(.)來修改 JSON 對象的值:
myObj.sites.site1 = "www.google.com";
你可使用中括號([])來修改 JSON 對象的值:
myObj.sites["site1"] = "www.google.com";
咱們可使用 delete 關鍵字來刪除 JSON 對象的屬性:
delete myObj.sites.site1;
你可使用中括號([])來刪除 JSON 對象的屬性:
delete myObj.sites["site1"]
[ "Google", "Runoob", "Taobao" ]
JSON 數組在中括號中書寫。
JSON 中數組值必須是合法的 JSON 數據類型(字符串, 數字, 對象, 數組, 布爾值或 null)。
JavaScript 中,數組值能夠是以上的 JSON 數據類型,也能夠是 JavaScript 的表達式,包括函數,日期,及 undefined。
對象屬性的值能夠是一個數組:
{ "name":"網站", "num":3, "sites":[ "Google", "Runoob", "Taobao" ] }
咱們可使用索引值來訪問數組:
x = myObj.sites[0];
你可使用 for-in 來訪問數組:
for (i in myObj.sites) { x += myObj.sites[i] + "<br>"; }
你也可使用 for 循環:
for (i = 0; i < myObj.sites.length; i++) { x += myObj.sites[i] + "<br>"; }
JSON 對象中數組能夠包含另一個數組,或者另一個 JSON 對象:
myObj = { "name":"網站",
"num":3,
"sites": [ { "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻譯" ] },
{ "name":"Runoob", "info":[ "菜鳥教程", "菜鳥工具", "菜鳥微信" ] },
{ "name":"Taobao", "info":[ "淘寶", "網購" ] }
]
}
咱們可使用 for-in 來循環訪問每一個數組:
for (i in myObj.sites) { x += "<h1>" + myObj.sites[i].name + "</h1>"; for (j in myObj.sites[i].info) { x += myObj.sites[i].info[j] + "<br>"; } }
你可使用索引值來修改數組值:
myObj.sites[1] = "Github";
咱們可使用 delete 關鍵字來刪除數組元素:
delete myObj.sites[1];
JSON.parse()
JSON 一般用於與服務端交換數據。
在接收服務器數據時通常是字符串。
咱們可使用 JSON.parse() 方法將數據轉換爲 JavaScript 對象。
JSON.parse(text[, reviver])
參數說明:
例如咱們從服務器接收了如下數據:
{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }
咱們使用 JSON.parse() 方法處理以上數據,將其轉換爲 JavaScript 對象:
var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
解析前要確保你的數據是標準的 JSON 格式,不然會解析出錯。
你可使用咱們的在線工具檢測:https://c.runoob.com/front-end/53。
解析完成後,咱們就能夠在網頁上使用 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 從服務器請求 JSON 數據,並解析爲 JavaScript 對象。
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();
查看服務端數據: json_demo.txt
若是從服務端接收的是數組的 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_demo_array.txt
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;
咱們能夠啓用 JSON.parse 的第二個參數 reviver,一個轉換結果的函數,對象的每一個成員調用此函數。
var text = '{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}'; var obj = JSON.parse(text, function (key, value) { if (key == "initDate") { return new Date(value); } else { return value; }}); document.getElementById("demo").innerHTML = obj.name + "建立日期:" + obj.initDate;
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.parse() 函數:
JSON.stringify()
JSON 一般用於與服務端交換數據。
在向服務器發送數據時通常是字符串。
咱們可使用 JSON.stringify() 方法將 JavaScript 對象轉換爲字符串。
JSON.stringify(value[, replacer[, space]])
參數說明:
必需, 一個有效的 JSON 字符串。
可選。用於轉換結果的函數或數組。
若是 replacer 爲函數,則 JSON.stringify 將調用該函數,並傳入每一個成員的鍵和值。使用返回值而不是原始值。若是此函數返回 undefined,則排除成員。根對象的鍵是一個空字符串:""。
若是 replacer 是一個數組,則僅轉換該數組中具備鍵值的成員。成員的轉換順序與鍵在數組中的順序同樣。當 value 參數也爲數組時,將忽略 replacer 數組。
可選,文本添加縮進、空格和換行符,若是 space 是一個數字,則返回值文本在每一個級別縮進指定數目的空格,若是 space 大於 10,則文本縮進 10 個空格。space 有可使用非數字,如:\t。
例如咱們向服務器發送如下數據:
咱們使用 JSON.stringify() 方法處理以上數據,將其轉換爲字符串:
myJSON 爲字符串。
咱們能夠將 myJSON 發送到服務器:
咱們也能夠將 JavaScript 數組轉換爲 JSON 字符串:
myJSON 爲字符串。
咱們能夠將 myJSON 發送到服務器:
JSON 不能存儲 Date 對象。
JSON.stringify() 會將全部日期轉換爲字符串。
以後你能夠再將字符串轉換爲 Date 對象。
JSON 不容許包含函數,JSON.stringify() 會刪除 JavaScript 對象的函數,包括 key 和 value。
咱們能夠在執行 JSON.stringify() 函數前將函數轉換爲字符串來避免以上問題的發生:
不建議在 JSON 中使用函數。
主流瀏覽器都支持 JSON.stringify() 函數:
JSON使用
JSON 最多見的用法之一,是從 web 服務器上讀取 JSON 數據(做爲文件或做爲 HttpRequest),將 JSON 數據轉換爲 JavaScript 對象,而後在網頁中使用該數據。
爲了更簡單地爲您講解,咱們使用字符串做爲輸入進行演示(而不是文件)。
建立包含 JSON 語法的 JavaScript 字符串:
var txt = '{ "sites" : [' + '{ "name":"菜鳥教程" , "url":"www.runoob.com" },' + '{ "name":"google" , "url":"www.google.com" },' + '{ "name":"微博" , "url":"www.weibo.com" } ]}';
因爲 JSON 語法是 JavaScript 語法的子集,JavaScript 函數 eval() 可用於將 JSON 文本轉換爲 JavaScript 對象。
eval() 函數使用的是 JavaScript 編譯器,可解析 JSON 文本,而後生成 JavaScript 對象。必須把文本包圍在括號中,這樣才能避免語法錯誤:
var obj = eval ("(" + txt + ")");
在網頁中使用 JavaScript 對象:
var txt = '{ "sites" : [' + '{ "name":"菜鳥教程" , "url":"www.runoob.com" },' + '{ "name":"google" , "url":"www.google.com" },' + '{ "name":"微博" , "url":"www.weibo.com" } ]}'; var obj = eval ("(" + txt + ")"); document.getElementById("name").innerHTML=obj.sites[0].name document.getElementById("url").innerHTML=obj.sites[0].url
eval() 函數可編譯並執行任何 JavaScript 代碼。這隱藏了一個潛在的安全問題。
使用 JSON 解析器將 JSON 轉換爲 JavaScript 對象是更安全的作法。JSON 解析器只能識別 JSON 文本,而不會編譯腳本。
在瀏覽器中,這提供了原生的 JSON 支持,並且 JSON 解析器的速度更快。
較新的瀏覽器和最新的 ECMAScript (JavaScript) 標準中均包含了原生的對 JSON 的支持。
Web 瀏覽器支持 | Web 軟件支持 |
---|---|
|
|
對於較老的瀏覽器,可以使用 JavaScript 庫: https://github.com/douglascrockford/JSON-js
JSON 格式最初是 originally specified by Douglas Crockford
JSONP___其實我想說 我有點沒看懂 PHP不懂啊-_-
本章節咱們將向你們介紹 JSONP 的知識。
Jsonp(JSON with Padding) 是 json 的一種"使用模式",可讓網頁從別的域名(網站)那獲取資料,即跨域讀取數據。
爲何咱們從不一樣的域(網站)訪問數據須要一個特殊的技術(JSONP )呢?這是由於同源策略。
同源策略,它是由Netscape提出的一個著名的安全策略,如今全部支持JavaScript 的瀏覽器都會使用這個策略。
如客戶想訪問 : http://www.runoob.com/try/ajax/jsonp.php?jsonp=callbackFunction。
假設客戶指望返回JSON數據:["customername1","customername2"]。
真正返回到客戶端的數據顯示爲: callbackFunction(["customername1","customername2"])。
服務端文件jsonp.php代碼爲:
<?php header('Content-type: application/json'); //獲取回調函數名 $jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']); //json數據 $json_data = '["customername1","customername2"]'; //輸出jsonp格式的數據 echo $jsoncallback . "(" . $json_data . ")"; ?>
<script type="text/javascript"> function callbackFunction(result, methodName) { var html = '<ul>'; for(var i = 0; i < result.length; i++) { html += '<li>' + result[i] + '</li>'; } html += '</ul>'; document.getElementById('divCustomers').innerHTML = html; } </script>
<div id="divCustomers"></div>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JSONP 實例</title> </head> <body> <div id="divCustomers"></div> <script type="text/javascript"> function callbackFunction(result, methodName) { var html = '<ul>'; for(var i = 0; i < result.length; i++) { html += '<li>' + result[i] + '</li>'; } html += '</ul>'; document.getElementById('divCustomers').innerHTML = html; } </script> <script type="text/javascript" src="http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction"></script> </body> </html>
以上代碼可使用 jQuery 代碼實例:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JSONP 實例</title> <script src="http://cdn.static.runoob.com/libs/jquery/1.8.3/jquery.js"></script> </head> <body> <div id="divCustomers"></div> <script> $.getJSON("http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=?", function(data) { var html = '<ul>'; for(var i = 0; i < data.length; i++) { html += '<li>' + data[i] + '</li>'; } html += '</ul>'; $('#divCustomers').html(html); }); </script> </body> </html>