摘要:,指的對象表示法,它本身是個字符串,是一種數據交換格式,并非對象。字符串必須使用雙引號表示,不能使用單引號。數組或對象最后一個成員的后面,不能有逗號。不合法的會在解析成對象時,出現錯誤。替代方法對象下雖然提供了完整的字符串和對象的轉換方法。
JSON(JavaScript Object Notation),指JavaScript的對象表示法,它本身是個字符串,是一種數據交換格式,并非對象。通常所提的JSON對象實際是JSON字符串解析成對象的結果,或是瀏覽器window對象下的JSON對象。
而且JSON不止用于JavaScript中,其廣泛用于數據交換。
JSON和JavaScript對象一個JSON文件,或一段JSON字符串,通常是這樣的:
[{ "name": "用戶權限管理", "code": "99990002", "icon": "modicon-1", "items": [{ "name": "模塊權限", "code": "999900020009", "url": "", "isBlank": false, "items": [{ "name": "向導模板", "code": "9999000200090003", "url": "pages/accLayoutTest.html", "isBlank": false, "items": [] }, { "name": "模塊管理我們的", "code": "9999000200090001", "url": "pages/contentPageTest.html", "isBlank": false, "items": [] }] }] }, ... ]
而這樣類似的JavaScript對象則是這樣的:
var menuData = [{ name: "用戶權限管理", code: "99990002", icon: "modicon-1", items: [{ name: "模塊權限", code: "999900020009", url: "", isBlank: false, items: [{ name: "向導模板", code: "9999000200090003", url: "pages/accLayoutTest.html", isBlank: false, items: [] }, { name: "模塊管理我們的", code: "9999000200090001", url: "pages/contentPageTest.html", isBlank: false, items: [] }] }] }, ...]
兩者非常的相似,所不同的是就是JavaScript對象中屬性名,也就是對象的key值是可以沒有引號的,其值為字符串時,使用""和""包裹均可。 因此我們很多人將第一段代碼塊里所寫的JSON稱為JSON對象,實際上,它并不是一個對象,只是一個單純的字符串而已,但是它符合JSON的語法規則,可以很方便地轉化為JavaScript對象,或者方便地用于數據交換。
以下我們來了解一下JSON。
JSON語法
JSON語法規則
JSON 語法是 JavaScript 對象表示語法的子集,其基本原則如下:
數據在鍵值對中
數據由逗號分隔
花括號保存對象
方括號保存數組
JSON的值
數字(整數或浮點數)
字符串(在雙引號中)
邏輯值(true 或 false)
數組(在方括號中[])
對象(在花括號中{})
null
JSON作為一種數據交換格式,為了保證其能被正確方便的解析,其格式有嚴格的要求,必須遵循以下規則:
復合類型的值只能是數組或對象,不能是函數、正則表達式對象、日期對象。
簡單類型的值只有四種:字符串、數值(必須以十進制表示)、布爾值和null(不能使用NaN, Infinity, -Infinity和undefined)。
字符串必須使用雙引號表示,不能使用單引號。
對象的鍵名必須放在雙引號里面。
數組或對象最后一個成員的后面,不能有逗號。
數值前不能加0。
以下是合法的JSON格式示例:
["one", "two", "three"] { "one": 1, "two": 2, "three": 3 } { "names": [ "張三", "李四" ] } [ { "name": "張三" }, { "name": "李四" } ]
下面這些就是不合法的:
{ name: "張三", "age": 32 } // 屬性名必須使用雙引號 [32, 64, 128, 0xFFF] // 不能使用十六進制值 { "name": "張三", "age": undefined } // 不能使用undefined { "name": "張三", "birthday": new Date("Fri, 26 Aug 2011 07:13:10 GMT"), "getName": function() { return this.name; } } // 不能使用函數和日期對象 { "name": "李四", "age": 018 } // 數值前不能有0
JSON和JavaScript對象的轉化 window.JSON以上代碼中為了指出錯誤所在,使用了JavaScript的注釋法,實際JSON中是不能有注釋的。
不合法的JSON會在解析成JavaScript對象時,出現錯誤。
JSON作為一種數據交換格式,被寫入了ECMAScript 5,在IE8及之后的瀏覽器都提供了一個JSON對象,用于對JSON進行解析和序列化。
JSON.parse()此方法接收一個JSON字符串,返回解析后的JavaScript對象,通常為Object或Array。
// JSON數據 var humansData = "[{"name":"zs","age":28},{"name":"ls","age":26}]"; // 解析為JavaScript對象 var humans = JSON.parse(humansData); // 之后就可以訪問其元素或屬性了 humans[1].name; // ls humans[1].age; // 26
如果傳入不合法的JSON,則會在JSON.parse時報錯。
為什么我們在ajax請求中,即使請求的數據為JSON,我們不用解析就能直接使用呢?
// test.text內容 /* [{ "name":"zs", "age":28 },{ "name":"ls", "age":26 }] */ $.ajax({ url: "./test/test.text", dataType: "JSON" }).done(function(data){ console.dir(data); // Array[2] console.log(data[0].name); // zs // 這里沒有轉化為js對象就能訪問其屬性?! });
這里實際是因為指定了dataType為JSON,從而進行了自動轉化,所以能直接在成功回調中使用其屬性。如果去掉dataType的指定,就不能直接訪問其屬性了,因為未轉化時,其本身是一個字符串。第一行輸出為test.text的內容,第二行輸出undefined。
JSON.stringify()此方法可接收一個JavaScript值將轉化為JSON字符串,此字符串可被JSON.parse還原。
var humans = [{ "name": "zs", "age": 28, "birth": new Date() }, { "name": "ls", "age": 26, "birth": new Date() }]; // 轉化為JSON字符串 JSON.stringify(humans); // "[{"name":"zs","age":28,"birth":"2016-10-25T07:24:11.701Z"},{"name":"ls","age":26,"birth":"2016-10-25T07:24:11.701Z"}]"
前面我們講到了JSON中并非支持所有的JavaScript類型,因此此方法對一些JSON不可接受的值有所處理:原始對象中,如果有一個成員的值是undefined、函數或XML對象,這個成員會被省略。如果數組的成員是undefined、函數或XML對象,則這些值被轉成null。
我們還發現,JSON中是不支持Date對象的,而上述轉化為字符串的結果中正確包含了birth的值,其為一個日期格式的字符串。這是因為在Date對象上有一個名為toJSON的方法,JSON.stringify在序列化時,實際是調用了這個方法來輸出結果的。
如果一個被序列化的對象擁有 toJSON 方法,那么該 toJSON 方法就會覆蓋該對象默認的序列化行為:不是那個對象被序列化,而是調用 toJSON 方法后的返回值會被序列化,例如:
var obj = { foo: "foo", toJSON: function() { return "bar"; } }; JSON.stringify(obj); // ""bar"" JSON.stringify({x: obj}); // "{"x":"bar"}"
了解即可,詳見: MDN:JSON.stringify(){.doc-link}
我們可能經常看到的是JSON.stringify( obj , null , 4),這樣是什么意思呢?
對于上例,替換最后一句,結果如下所示:
JSON.stringify(humans, null, 4); // "[ // { // "name": "zs", // "age": 28, // "birth": "2016-10-25T07:24:11.701Z" // }, // { // "name": "ls", // "age": 26, // "birth": "2016-10-25T07:24:11.701Z" // } // ]"
其實沒什么變化,不過是加上了空格縮進,使得可讀性更高了。
其余兩個參數的說明如下:
第二個參數可指定序列化時的操作。
如果該參數是一個函數,則在序列化過程中,被序列化的值的每個屬性都會經過該函數的轉換和處理;
如果該參數是一個數組,則只有包含在這個數組中的屬性名才會被序列化到最終的 JSON 字符串中;
如果該參數為null或者未提供,則對象所有的屬性都會被序列化;
第三個參數用于指定縮進用的空白字符串,用于美化輸出(pretty-print);
如果參數是個數字,它代表有多少的空格;上限為10。該值若小于1,則意味著沒有空格;
如果該參數為字符串(字符串的前十個字母),該字符串將被作為空格;
如果該參數沒有提供(或者為null)將沒有空格。
替代方法window.JSON對象下雖然提供了完整的JSON字符串和JavaScript對象的轉換方法。但是在IE8(兼容模式)以及更低版本的IE下沒有提供這個對象,因此我們需要一些替代方案。
jQuery中提供了parseJSON這樣一個方法來替代JSON.parse,它接收一個標準格式的JSON字符串,返回一個解析后的JavaScript對象。
使用http://www.json.org/提供了一個json.js,這樣ie8(兼容模式),ie7和ie6就可以支持JSON對象以及其stringify()和parse()方法; 可以在https://github.com/douglascrockford/JSON-js上獲取到這個js,一般現在用json2.js。
還可以使用 eval("(" + jsonstr + ")") ; 來將json字符串轉換成json對象,注意需要在json字符外包裹一對小括號。但最好不要使用這種方式,因為這種方式不安全,eval會將JSON字符串作為JavaScript語句來執行,JSON中的風險代碼將被執行。
參考鏈接JSON
JSON對象
根本沒有“JSON對象”這回事!
JavaScript標準庫-JSON對象
js對象與JSON字符串互轉
我的博客 - JavaScript 原型鏈
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88200.html
摘要:獨立于語言和平臺,解析器和庫支持許多不同的編程語言。數據轉換數據轉換為對象解析器函數創建包含語法的字符串使用解析器,解析文本并生成對象使用函數時,必須為傳入的數據參數添加括號,否則會報語法錯誤。 區別 JSON(JavaScript Object Notation)僅僅是一種數據格式(或者叫數據形式)。數據格式其實就是一種規范,按照這種規范來存諸和交換數據。就好像 XML 格式一樣。 ...
摘要:簡介是對象表示法的縮寫是一種數據格式而不是一種編程語言用來表示結構化數據是的一個嚴格子集并不從屬于很多編程語言都可以用數據格式語法語法可以表示以下三種類型的值簡單值字符串數值布爾值但是不支持對象數組不支持變量函數對象實例簡單值字符串數字布爾 JSON 簡介 JSON是JavaScript Object Notation(JavaScript對象表示法)的縮寫 JSON是一種數據格式,...
摘要:更多資料如果你想了解更多關于的資料,下面的連接對你絕對有用關于本文本文轉自大叔的深入理解系列。深入理解系列文章,包括了原創,翻譯,轉載,整理等各類型文章,原文是大叔的一個非常不錯的專題,現將其重新整理發布。 前言 寫這篇文章的目的是經常看到開發人員說:把字符串轉化為JSON對象,把JSON對象轉化成字符串等類似的話題,所以把之前收藏的一篇老外的文章整理翻譯了一下,供大家討論,如有錯誤,...
摘要:布爾值和也是有效的形式。同一個對象中絕對不應該出現兩個同名屬性。序列化選項還可以接受兩個參數,用于指定以不同方式序列化對象。當傳入了有效縮進參數值,結果字符串就會包含換行符。對第步返回的每個值進行相應的序列化。 前言 JSON(JavaScript Object Notation,JavaScript對象表示法)是JavaScript的一個嚴格的子集,利用了JavaScript中的一些...
摘要:官方的說法,也不是特別的明了,只說明了這是一種輕量級的數據交換格式,且基于一個子集。的語法介紹常見數據結構有兩種形式,其分別是名稱值對的集合,類似中的對象。比如,則在中是行不通的。 寫這篇文章的緣由 你了解JSON嘛?JSON是JavaScript中對象嘛?JSON可以存儲function對象嘛?JSON的本質是什么呢?JSON能寫注釋嘛? 如果你都能答上來,那恭喜你,你對JSON了...
閱讀 1625·2021-09-22 15:25
閱讀 1506·2021-09-07 10:06
閱讀 3183·2019-08-30 15:53
閱讀 1090·2019-08-29 13:12
閱讀 3373·2019-08-29 13:07
閱讀 725·2019-08-28 18:19
閱讀 2269·2019-08-27 10:57
閱讀 982·2019-08-26 13:29