摘要:官方的說法,也不是特別的明了,只說明了這是一種輕量級的數據交換格式,且基于一個子集。的語法介紹常見數據結構有兩種形式,其分別是名稱值對的集合,類似中的對象。比如,則在中是行不通的。
寫這篇文章的緣由
你了解JSON嘛?JSON是JavaScript中對象嘛?JSON可以存儲function對象嘛?JSON的本質是什么呢?JSON能寫注釋嘛?
如果你都能答上來,那恭喜你,你對JSON了解的很測底,如果你有寫不太明白,哪有必要和我一起來探討JSON。
我之前對JSON的概念也是一知半解,常常和JavaScript的Object對象混淆,所以就導致了很多種種的錯誤,特別是在研究NodeJS中,有一個叫package.json的文件專門用來存儲json格式的數據。如果你在這個文件里面寫注釋,或者存儲函數,最終解析這個文件時就會報錯。
然后自己查閱了些相關的資料,得出些結論。現在拿出來和大家分享一下,同時,假如文章中有紕漏的地方,大家可以幫我指點糾正下。
JSON是什么首先我們來看看官方是怎么描述JSON的:JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易于人閱讀和編寫。同時也易于機器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數據交換語言。參考來源地址:http://www.json.org/json-zh.html。
官方的說法,也不是特別的明了,只說明了這是一種輕量級的數據交換格式,且基于JavaScript一個子集。這根本說明不了什么?不過我聯想到了另外一種數據交換格式,那就是xml,這個格式特別在webService中被大量使用。xml是什么呢,其本質是一種DOM結構。對比一下,那json的本質就是字符串了,不過這個字符串不是不同的字符串,它有一些列的語法和結構。下面我們就介紹下其語法。
JSON的語法介紹常見JSON數據結構有兩種形式,其分別是:
“名稱/值”對的集合,類似JavaScript中的對象。
值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
首先來看第一種情況:對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
這和JavaScript中的對象字面量比較類似,但是本質上還是有些區別的。比如對象中的名稱(或者稱為key)是必須用雙引號括起來的。單引號都不行,更別說忽略它了,雖然JavaScript中的對象中的名稱值常常忽略雙引號。比如
{ name : "test", age : 123, success : function(){ //todo } }
則在JSON中是行不通的。除了"名稱(key)"值有限制外,對象中的"值(value)"也做了限制,比如在JavaScript中的對象字面量中的值可以隨便賦值,不管是字符串、數組、函數、整形都是可以的。JSON中的取值可以是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array),
除此之外,這些值以外都會被解析出問題,像剛才頭中提到的,如果給JSON的值賦值一個function是一個錯誤的行為。
接下來,看看值的有序列表(或者稱為數組),數組是值的有序列表,一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔,并且值的限制情況在上面中已經提到。
差不多把語法介紹完了,總結一下,JSON其本質是一串有意義的字符串數據交互格式。呵呵,不知道我定義的正不正確。
JavaScript語言中JSON的解析和序列化在JavaScript中經常是要對JSON進行處理的,比如提交一個數據前常常需要對其進行序列化處理,從后來拉過來的JSON數據,我們經常要對它進行解析然后得到一個JavaScript對象。可能由于大家經常使用一些JavaScript類庫,這些庫對JSON的操作做了封裝,所以造成一種現象,那就是我們只會用,對齊本質,我們了解甚少。現在我們就拋開類庫,了解其底層的本質。
早期的JSON解析器通過JavaScript中eval()函數來解析的。直到ECMA5對齊進行了規范,并且定義了一個全局的JSON對象用來對JSON進行解析和序列化。支持JSON這個全局對象的瀏覽器包括IE8+、FF3.5+、Safari4+、Chrome和Opera10.5+。對于不支持這個對象的瀏覽器比如IE6、IE7怎么做處理呢?
不用擔心,JSON的發明者早就幫我們實現了兼容的代碼,其地址為:https://github.com/douglascrockford/JSON-js。對于不支持原生的JSON對象的。我們可以引入這段代碼解決兼容性的問題。
JSON有兩個主要方法,用來解決JSON的序列化和解析,其分別是stringfy和parse.讓我們分別來看看它們的用法。
ECMA5定義的標準接口如下所示:
/** @param {*} value @param {Function} [replacer] @param {Number|String} [space] @static */ JSON.stringify = function(value,replacer,space) {};
其中對一個參數是必須滴,而且是我們要進行序列化的對象。示例代碼如下所示:
var obj = { name : "hello", age : 18 } var jsonText = JSON.stringify(obj) //輸出:{"name":"hello","age":18}
第二個參數是可選項,可以是函數或者是數組。如果是數組,那么數組中指定是過濾項,以上面例子為例,進行如下調用:
var jsonText = JSON.stringify(obj,["name"]) //輸出: {"name":"hello"}
如果是函數的話,回調函數里面的參數對應Javascript中對象里面的key和value值。示例如下:
var jsonText = JSON.stringify(obj,function(key,value){ switch(key) { case "name": return value+" json"; case "age" : return 20; default : return value; } }); //輸出 {"name":"hello json","age":20}
第三個參數也是可選的。用來進行字符串縮進,示例如下:
var jsonText = JSON.stringify(obj,null,4); //按4個空格縮進 //輸出的結果不再是單行,而是下面的形式: { "name" : "hello", "age" : 18 }
除了可以設置數字外,還可以用字符設置縮進,有興趣大家可以嘗試一下。
ECMA5對parse接口的定義如下:
/** @param {string} jsonString @param {Function} [reviver] @static */ JSON.parse = function(jsonString,reviver) {};
該方法接受兩個參數,其中第二個參數是可選的。
第一個參數的作用是待轉換的JSON字符串。比如我們可以將上面的jsonText通過parse還原成原來的Javascript對象。
var obj = JSON.parse(jsonText); //obj為JavaScript對象。
第二個參數是一個函數,用來更加細微的控制轉換過程。它接受兩個參數,分別對應著JSON數據的鍵值對。調用示例如下:
var obj = JSON.parse(jsonText,function(key,value){ //todo });幫助鏈接
JSON中文官網
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85466.html
摘要:在這里的腳本有,部署到預發布生產服務器,清理目錄,壓縮,備份數據庫,在本地,等等。目錄存儲了所有數據庫,,,,等等的配置文件。我使用做所有的排序任務,從發送郵件到從拉取數據。當我第一次開始開發和的時候,我使用,但是已經把所有事情移植進了。 本文原文是 11 Things I Wish I Knew About Django Development Before I Star...
摘要:缺點需要增加本地的代碼量,以及需要配置實現攔截優點數據通過會更豐富。缺點修改內容溝通成本高,跟后端扯皮利用去模擬優點可控內容以及實現動態。三本地周邊知識本地的思想就是利用完成。注意接口的和自己的接口不要沖突。 VueCli3.0中集成MockApi 一:使用場景 哎喲,好煩啊,這個需求還么結束就來下一個需求,程序員不要排期的嗎? 沒辦法啊,資本主義的XX嘴臉啊 來吧,技術評審我倆把接口...
摘要:它的目的是提供正確的方式進行頁面交互測試,所以可以使用去點擊按鈕或者鏈接填寫表單甚至拖放。此外,提到測試運行比更快。此次因底層架構改變較大而重命名。這個功能受到的啟發,能夠將元素簡化為可重用區域。 showImg(https://segmentfault.com/img/remote/1460000008212617); 轉自 Laravel 社區:https://laravel-ch...
閱讀 1325·2023-04-26 01:28
閱讀 2083·2021-11-08 13:28
閱讀 2329·2021-10-12 10:17
閱讀 2306·2021-09-28 09:46
閱讀 4153·2021-09-09 09:33
閱讀 3733·2021-09-04 16:40
閱讀 1116·2019-08-29 15:21
閱讀 2699·2019-08-26 17:17