什么是JSON
- JSON是一種數(shù)據(jù)交換格式
- JSON獨(dú)立于編程語言,雖然是JS的子集
- JSON基于JS對象字面量表示法
- JSON表達(dá)數(shù)據(jù)的方式對通用的編程概念友好(可移植性)
PS:
表示法:一個用于表示數(shù)據(jù)的字符系統(tǒng)
數(shù)據(jù)交換格式:用于不同平臺或系統(tǒng)間交換數(shù)據(jù)的文本
可移植性:不同系統(tǒng)平臺間兼容性好
JSON語法
- JSON基于JS對象字面量中表示屬性的語法,但不包含JS對象中的方法
- JSON的名稱-值對中,名稱始終被雙引號包裹(""),值可以是字符串,數(shù)字,布爾值,null,對象或數(shù)組
- 名稱-值對列表被花括號包裹({})
- 多個名稱-值對間用逗號(,)隔開
- 文件擴(kuò)展名為.json
- 媒體類型為application/json
舉個栗子
{
"age":20,
"name":"tao",
"sex":"man"
}
字面量
:是對數(shù)據(jù)值的具體表示
變量
:通過標(biāo)識符來表示的,可修改的值
x = x + 5
其中5就是一個數(shù)字字面量
JSON的數(shù)據(jù)類型
- JSON的布爾類型的值只有true和false,必須小寫
- JSON的null值也必須小寫
- 數(shù)據(jù)類型的對象和數(shù)組的一個關(guān)鍵區(qū)別是,對象是名稱-值對構(gòu)成的列表或集合,數(shù)據(jù)是值構(gòu)成的列表和集合
- 對象和數(shù)組另一個區(qū)別是,數(shù)組中的值應(yīng)具有相同的數(shù)據(jù)類型(因為在JS里數(shù)組存入的數(shù)據(jù)類型可以不一樣,但是使用JSON作為數(shù)據(jù)傳輸?shù)挠植恢皇荍S,而大多數(shù)編程語言都不支持?jǐn)?shù)組中的元素數(shù)據(jù)類型不一樣)
舉個栗子
{
"boy":{
"name":"tao",
"age":20
},
"arr":[
1,
2
]
}
ps:
JSON的字符串類型,使用("")雙引號包裹(因為一般編程語言的string類型都是雙引號包裹的)
布爾類型:true 或 false
數(shù)字類型:46 可以是整數(shù),小數(shù),或指數(shù)
null類型:null 代表一個空值
數(shù)組類型:用方括號包裹[]
對象類型:用花括號包裹{}
JSON Schema
數(shù)據(jù)交換中的一種虛擬"合同"
- JSON Schema 負(fù)責(zé)的是提供一致性的檢驗,是數(shù)據(jù)接收方的第一道防線,可以節(jié)省時間和保證數(shù)據(jù)正確,像是一個過濾器。
- JSON Schema可以解決如下問題
- 值的數(shù)據(jù)類型是否正確,規(guī)則值的數(shù)據(jù)類型
- 是否是我要的數(shù)據(jù),具體規(guī)定哪些是我要的,哪些是我不要的
- 可以規(guī)定值的范圍,最大值和最小值
JSON中的安全問題
- 服務(wù)端:提供服務(wù)的一端,例如 Web服務(wù)器
- 客戶端:請求服務(wù)的一端,例如 Web瀏覽器
- 跨站請求偽造(CSRF)
指利用站點(diǎn)對用戶瀏覽器的信任進(jìn)行的攻擊,比如GET請求中直接暴露在外的用戶信息 - 頂層JSON數(shù)組
存于JSON名稱-值對之外的位于文檔最頂層的JSON數(shù)組,雖然在JS中允許,但不規(guī)范,也存在安全問題,不推薦使用 - 注入攻擊
利用某些bug注入惡意代碼進(jìn)行攻擊 - JSON跨站腳本攻擊
通過截取或?qū)⒄军c(diǎn)中所使用的第三方代碼更換為惡意腳本,進(jìn)行注入攻擊 - 關(guān)于JSON安全問題要注意以下幾項
- 不要使用頂級數(shù)組
- 盡量使用POST請求
- 使用JSON.parse()代替eval()方法,因為eval()方法容易被注入惡意代碼
JavaScript中的XMLHttpRequest與Web API
- Web API
通過HTTP與服務(wù)進(jìn)行交互的一系列指令與標(biāo)準(zhǔn) - XMLHttpRequest
一種JavaScript對象,無需刷新頁面即可從一個URL獲取數(shù)據(jù)(異步交互),常用與Ajax編程 - 超文本傳輸協(xié)議 http
- 序列化
將對象轉(zhuǎn)化為文本的操作,JSON.stringify() JavaScript對象轉(zhuǎn)為JSON字符串 - 反序列化
將序列化的文本轉(zhuǎn)化為對象的操作,JSON.parse() JSON字符串轉(zhuǎn)為JavaScript對象 - 同源策略
出于安全考慮,瀏覽器僅會請求同一域的腳本 - 跨域資源共享(CORS)
通過設(shè)置響應(yīng)頭,使得跨域請求資源成功 - JSON-P
使用<script>標(biāo)簽,繞過同源策略的限制,實(shí)現(xiàn)不同域名的服務(wù)器上請求JSON - XMLHttpRequest與Web API是客戶端和服務(wù)端的關(guān)系
- XMLHttpRequest并不只限于XML,還可以請求JSON資源
JSON與客戶端框架
- 抽象化
一種處理復(fù)雜系統(tǒng)的技術(shù),主要是把一個大問題分解為若干子問題 - 框架
一種可以節(jié)約時間,讓我們更專注于構(gòu)建功能的抽象化工具 - 單頁Web應(yīng)用
與傳統(tǒng)的多頁方式不同,著力于提供更加無縫的應(yīng)用體驗頁面 - MVC
數(shù)據(jù)模型,視圖,控制器