1. 程式人生 > >JSON是什麼?如何正確理解?

JSON是什麼?如何正確理解?

1.背景介紹

什麼是JSON

JSON (JavaScript Object Notation, JS 物件標記) 是一種輕量級的資料交換格式。它基於 ECMAScript (w3c制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。——百度百科

資料傳輸是我們在敲程式碼時,經常遇到的一個場景,前後端互動。給資料一個統一的格式有利於我們編寫和解析資料。

json,是一種資料格式,在與後端的資料互動中有較為廣泛的應用。

JSON的誕生

JSON是 (JavaScript Object Notation, JS 物件標記),它是一種資料交換格式。在JSON出現之前,大家一直用XML來傳遞資料。因為XML是一種純文字格式,所以它適合在網路上交換資料。XML本身不算複雜,但是,加上DTD、XSD、XPath、XSLT等一大堆複雜的規範以後,任何正常的軟體開發人員碰到XML都會感覺頭大了,最後大家發現,即使你努力鑽研幾個月,也未必搞得清楚XML的規範。

終於,在2002年的一天,道格拉斯·克羅克福特(DouglasCrockford)同學為了拯救深陷水深火熱同時又被某幾個巨型軟體企業長期愚弄的軟體工程師,發明了JSON這種超輕量級的資料交換格式。

由於JSON非常簡單,很快就風靡Web世界,並且成為ECMA標準。幾乎所有程式語言都有解析JSON的庫,而在JavaScript中,我們可以直接使用JSON,因為JavaScript內建了JSON的解析。把任何JavaScript物件變成JSON,就是把這個物件序列化成一個JSON格式的字串,這樣才能夠通過網路傳遞給其他計算機。如果我們收到一個JSON格式的字串,只需要把它反序列化成一個JavaScript物件,就可以在JavaScript中直接使用這個物件了。

轉義

我們在呼叫 jsonp 介面或者呼叫js檔案的時候,由於檔案編碼不同會導致出現亂碼的問題。 如果你的檔案出現了非英文字元,如果呼叫時檔案編碼不一致,同樣會出現亂碼情況。

這也就是為什麼要資料統一格式的原因。

JSON 是適用於 Ajax 應用程式的一種有效格式,原因是它使 JavaScript 物件和字串值之間得以快速轉換 JSON是一種傳遞物件的語法

JSON是一個提供了stringify和parse方法的內建物件

stringify將js物件轉化為符合json標準的字串

parse將符合json標準的字串轉化為js物件

2.知識剖析

JSON對值的型別和格式有嚴格的規定
複合型別的值只能是陣列或物件,不能是函式、正則表示式物件、日期物件。
簡單型別的值只有四種:字串、數值(必須以十進位制表示)、布林值和null(不能使用NaN, Infinity, -Infinity和undefined)。
字串必須使用雙引號表示,不能使用單引號。
物件的鍵名必須放在雙引號裡面。
陣列或物件最後一個成員的後面,不能加逗號。
  PS: 需要注意的是,空陣列和空物件都是合格的JSON值,null本身也是一個合格的JSON值。

JSON 的語法規則
JSON 的語法規則十分簡單,可稱得上“優雅完美”,總結起來有:
陣列(Array)用方括號(“[]”)表示。
物件(Object)用大括號(”{}”)表示。
名稱/值對(name/value)組合成陣列和物件。
名稱(name)置於雙引號中,值(value)有字串、數值、布林值、null、物件和陣列。
並列的資料之間用逗號(“,”)分隔

例項

JSON 資料的書寫格式是:名稱/值對。

名稱/值對組合中的名稱寫在前面(在雙引號中),值對寫在後面,中間用冒號隔開,

其中 值 可以是:數字(整數或浮點數)、字串(在雙引號中)、布林值(true或false)、陣列(在方括號中)、物件(在花括號中)、null

varjson= {"password":123456,"name":"myname","Booleans":true,"Array":[x,y,z],"object":{}}

或者是巢狀使用

轉義概述

為什麼需要轉義?在js中我們使用的js物件進行處理,但是在與後端資料交換的時候,我們傳送規定的json格式的字串,所以在給後端傳送或接受資料的時候,需要轉義

{name:"myname",password:123456}

"{"name":"myname","password":123456}"

其中json字串轉js物件,呼叫parse方法:

js物件 = JSON.parse(json字串);

js物件轉json字串,呼叫stringify方法:

json字串 = JSON.stringify(js物件);

3.常見問題

在json字串轉換成物件,還有eval_r('('+json字串+')')這個方法,但是在對目標資料進行讀取時,可能會出現一些意外的錯誤:

4.解決方案

原因:eval_r獲取的json物件的值中,如果有執行程式碼,也將照樣執行!所以若不能保證資料的安全性,不要使用eval_r方法進行轉義。

5.編碼實戰

下面是一個簡單的json資料傳送應用,有興趣可以閱讀一下:

6.擴充套件思考

我們常看到

{name:"myname",password:123456}

{"name":"myname","password":123456}

這樣兩種格式,即js物件和json,然而js物件和json有什麼不一樣的地方?

很多人搞不清楚 JSON 和 Js 物件的關係,甚至連誰是誰都不清楚。其實,可以這麼理解:

JSON 是 JS 物件的字串表示法,它使用文字表示一個 JS 物件的資訊,本質是一個字串。

var obj = {a: 'Hello', b: 'World'}; //這是一個物件,注意鍵名也是可以使用引號包裹的

var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字串,本質是一個字串

7.參考文獻

8.更多討論

1、XML是什麼?

XML與Access,Oracle和SQL Server等資料庫不同,資料庫提供了更強有力的資料儲存和分析能力,例如:資料索引、排序、查詢、相關一致性等,XML的宗旨傳輸資料的,而與其同屬標準通用標記語言的HTML主要用於顯示資料。事實上XML與其他資料表現形式最大的不同是:他極其簡單。這是一個看上去有點瑣細的優點,但正是這點使XML與眾不同。

2、向後臺傳輸資料要用什麼格式?

json字串格式,如果是一個物件要先用JSON.stringify()轉義,轉義成為字串才能將資料傳給後端。

3、後端傳過來的字串資料要怎樣才能轉義成為一個物件?

用JSON.parse()方法轉義。