主頁 > 前端設計 > 前端之JSON詳解

前端之JSON詳解

2021-12-09 08:47:57 前端設計

JSON

  • 一、語法
    • 1、簡單值
    • 2、物件
    • 3、陣列
  • 二、決議與序列化
    • 1、JSON物件
      • 1、stringify()方法
      • 2、parse()方法
    • 2、序列化選擇
      • 1、過濾結果
      • 2、字串縮進
      • 3、toJSON()方法
    • 3、決議選項

JSON:( JavaScript Object Notation JavaScript 物件標記法) 是一種存盤和交換資料的語法,JSON 是通過 JavaScript 物件標記法書寫的文本,它是一種資料格式,不是一種編程語言,雖然具有相同的語法形式,但JSON從不屬于JavaScript,而且,并不是只有JavaScript才使用JSON,畢竟JSON只是一種資料格式,很多編程語言都有針對JSON的決議器和序列化器,

一、語法

JSON的語法可以表示以下三種型別的值,

  • 簡單值:使用與JavaScript相同的語法,可以在JSON中表示字串、數值、布林值和null.
  • 物件:物件作為一種復雜資料型別,表示的是一組無序的鍵值對,而每個鍵值對中的值可以是簡單值,也可以是復雜資料型別的值
  • 陣列:陣列也是一種復雜資料型別,表示一組有序的值的串列,可以通過陣列索引來訪問其中的值,陣列的值也可以是任意型別——簡單值、物件或陣列,

JSON不支持變數、函式或物件實體,它就是一種表示結構化資料的格式,

1、簡單值

5

這就是JSON表示數值5的方式,

"Hello world!"

這是JSON表示字串的方式,JavaScript字串和JSON字串最大的區別在于:JSON字串必須使用雙引號(單引號會導致語法錯誤),

2、物件

JSON中的物件和JavaScript字面量稍微有一些不同,例如:

var person = {
	name: '投訓',
	age: 18
};

上述是一個JavaScript中創建字面量的方式,實際上,在JS中,這個物件字面量完全可以寫成:

var person = {
	"name": '投訓'"age": 18
};

但是,在JSON中,表示上述物件的方式為:

 {
	"name": '投訓'"age": 18
};

在這里,JSON有兩點與JavaScript不同,首先,沒有宣告變數(JSON中沒有變數的概念);其次,沒有末尾的分號,而且,需要注意的是:在JSON中,物件的屬性必須加雙引號,屬性的值可以是簡單值,也可以是復雜型別值,
比如:可以用JSON實作物件中嵌套物件

{
"name": "投訓".
"age":18,
"college": {
	"name": "西安郵電大學",
	"location": "xi'an"
}

上面這個例子在頂級物件中嵌套了學校(“college”)的資訊,雖然,在上面的例子中,有兩個name屬性,但由于他們分別屬于不同的物件,所以可以這樣寫,不過,同一個物件中絕對不應該出現兩個同名屬性,

3、陣列

JSON的第二種復雜資料型別是陣列,JSON陣列采用的就是JavaScript中的陣列字面量形式,
如下是JavaScript的陣列字面量:

var values = [25,"hello",true];

在JSON中,可以采用同樣的語法表示同一個陣列:

[25,"hello",true]

還可以把陣列和物件結合起來,構成更復雜的資料集合,例如:

[
	{
		"college": "西安郵電大學",
		"name": "投訓""sex": "女",
		"score": 100
	},{
		"college": "西北政法大學",
		"name": "王寧""sex": "女",
		"score": 98
	},{
		"college": "陜西師范大學",
		"name": "小熊""sex": "女",
		"score": 95
	},{
	"college": "西安交通大學",
		"name": "小明""sex": "男",
		"score": 99
	}
]

這個陣列包含一些表示學校學生的物件,每個物件都有幾個屬性,物件和屬性通常是JSON資料結構的最外層形式,利用他們可以創造出各種各樣的資料結構,

二、決議與序列化

JSON之所以流行,一方面是因為其擁有與JavaScript類似的語法,更重要的一方面是因為可以把JSON資料結構決議為有用的JavaScript物件,
以上例一組包含學校的JSON資料結構為例,在決議為JavaScript物件后,將其保存到變數message中,只需要很簡單的操作就可以獲取西安郵電大學的學生:

message[0].name

但是如果在DOM中查找的話,代碼就是:

doc.getElementsByTagName("message")[0].getAttrbute("name")

孰更簡單,一目了然,所以就不難理解為什么JSON越來越被歡迎了,我們就具體來看一下 :

1、JSON物件

JSON有兩種方法:stringify()parse(),在簡單的情況下,這兩個方法分別用于吧JavaScript物件序列化為JSON字串和把JSON字串決議為原生JavaScript值,

1、stringify()方法

例如:

var message = {
		"college": "西安郵電大學",
		"name": "投訓""sex": "女",
		"score": 100
};
var mes = JSON.stringify(message);

這個例子用JSON.stringify()把一個JavaScript物件序列化為一個JSON字串,然后將它保存在mes中,默認情況下,JSON.stringify()輸出的JSON字串不包含任何空格字符或縮進,因此保存在mes中的字串如下所示:

 {"college": "西安郵電大學","name": "投訓""sex": "女","score": 100}

我們來列印一下試試:
在這里插入圖片描述
在序列化JavaScript物件時,所有函式即原型成員都會被有意忽略,不體現在結果中,此外,值為undefined的任何屬性也都會被跳過,結果最終都是值為有效JSON資料型別的實體屬性,

2、parse()方法

將JSON字串直接傳遞給JSON.parse()就可以得到相應的JavaScript值,例如:下述代碼就可以創建于mes類似的物件:

var mesCopy = JSON.parse(mes);

列印一下nameCopy可以看到:該JSON字串被決議成了原生JavaScript值,
在這里插入圖片描述
注意:雖然mesmesCopy具有相同的屬性,但它們兩個是相互獨立的、沒有任何關系的物件,
如果傳給JSON.parse()的字串不是有效的JSON,該方法會拋出錯誤,

2、序列化選擇

實際上,JSON.stringify()除了要序列化的JavaScript物件外,還可以接收另外兩個引數,這兩個引數用于指定不同的方式序列化JavaScript物件,第一個引數是個過濾器,可以是一個陣列,也可以是一個函式,第二個引數是一個選項,表示是否在JSON字串中保留縮進,單獨或組合使用這兩個引數,可以更全面深入的控制JSON序列化,

1、過濾結果

如果過濾器引數是陣列,那么JSON.stringify()的結果中將只包含陣列,中列出的屬性,如下例:

var message = {
		"college": "西安郵電大學",
		"name": "投訓""sex": "女",
		"score": 100
};
var mes = JSON.stringify(message,["college","name"]);

JSON.stringify()的第二個引數是一個陣列,其中包含兩個字串:"college""name",這兩個屬性與將要序列化的物件中的屬性是對應的,因此在回傳的結果字串中,就會只包含這兩個屬性,我們來列印看看:
在這里插入圖片描述
如果第二個引數是函式,行為會稍有不同,傳入的函式接收兩個引數,屬性(鍵)名和屬性值,根據屬性(鍵)名可以知道應該如何處理要序列化的物件中的屬性,屬性名只能是字串,而在值并非鍵值對結構的值時,鍵名可以是空字串,為了改變序列化物件的結果,函式回傳的值就是相應鍵的值,不過要注意,如果函式回傳了undefined,那么相應的屬性會被忽略,舉例說明:

var message = {
		"college": "西安郵電大學",
		"name": "投訓""sex": "女",
		"score": 100};
var mes = JSON.stringify(message,function(key,value){
	switch(key){
		case "name":
			return value;
		case "score":
			return undefined;
		default:
			return value;
	}
});
console.log(mes);

如果鍵為"name",回傳其值,如果鍵為"score",通過回傳undefined洗掉該屬性,在最后,一定要提供default項,此時回傳傳入的值,以便其他值都能正常出現在結果中,
列印結果為:
在這里插入圖片描述
要序列化的物件中的每一個物件都要經過過濾器,因此陣列中的每個帶有這些屬性的物件經過過濾之后,每個物件都只會包含"college""name""sex"屬性,

2、字串縮進

JSON.stringify()方法的第三個引數用于控制結果中的縮進和空白符,如果這個引數是一個數值,那它表示的是每個級別縮進的空格數,
例如:要在每個級別縮進4個空格,可以這樣寫:

var message = {
		"college": "西安郵電大學",
		"name": "投訓",
		"sex": "女",
		"score": 100,
};
var mes = JSON.stringify(message,null,4);

再來列印一下結果看看:
在這里插入圖片描述
可以發現的是:JSON.stringify()也在結果字串中插入了換行符以提高可讀性,只要傳入有效的控制縮進的引數值,結果字串就會包含換行符,最大縮進空格數為10,所有大于10的值都會自動轉換為10,
如果縮進引數是一個字串而非數值,則這個字串將JSON字串中被用作縮進字符(不在使用空格),在使用字串的情況下,可以將縮進字符設定為制表符,或者兩個短劃線之類的任意字符,

var mes = JSON.stringify(message,null,"--"); 

這樣,mes中的字符將變成如下所示:
在這里插入圖片描述
需要注意的是:縮進字串最長不能超過10個字符長,如果字串長度超過了10個,結果將只出現前十個字符,

3、toJSON()方法

但是,JSON.stringify()有時候還是不能滿足對某些物件進行自定義序列的需求,在這些情況下,可以給物件定義toJSON()方法,回傳其自身的JSON資料格式,
可以為任何物件添加toJSON()方法,比如:

var message = {
		"college": "西安郵電大學",
		"name": "投訓",
		"sex": "女",
		"score": 100,
		toJSON:function(){
			return this.college;
		}
};
var mes = JSON.stringify(message);

以上代碼在message物件上定義了一個toJSON()方法,該方法回傳具體學校的學生姓名,toJSON()可以作為函式過濾器的補充,因此理解序列化的內部順序十分重要,
假設把一個物件傳入JSON.stringify(),序列化該物件的順序如下:

  1. 如果存在toJSON()方法并且能夠取到有效的值,則呼叫該方法,否則,回傳物件本身,
  2. 如果提供了第二個引數,應用這個函式過濾器,傳入函式過濾器的值是第一步回傳的值,
  3. 對第二步回傳的每個值進行相應的序列化,
  4. 如果提供了第三個引數,執行相應的格式化,

3、決議選項

JSON.parse()方法也可以接收另一個引數,該引數是一個函式,將在每個鍵值對上呼叫,為了區別JSON.stringify()接收的替換函式(replacer),這個函式被被稱為還原函式(reviver),但實際上這兩個函式的簽名是相同的——他們都接受兩個引數,一個鍵和一個值,而且都需要回傳一個值,
如果還原函式回傳undefined,則表示要從結果中洗掉相應的鍵;如果回傳其他值,則將該值插入到結果中,
將日期字串轉換成Date物件時,經常要用到還原函式,例如:

var message = {
		"college": "西安郵電大學",
		"name": "投訓",
		"sex": "女",
		"score": 100,
		releaseDate: new Date(2021,12,7)
	};
var mes = JSON.stringify(message);
var mesCopy = JSON.parse(mes,function(key,value){
	if(key == "releaseDate"){
		return new Date(value);
	}else{
		return value;
	}
});
console.log(mesCopy.releaseDate.getFullYear());

列印結果為:
在這里插入圖片描述
以上代碼先是為message物件新增了一個releaseDate屬性,該屬性保存著一個Date物件,這個物件在經過序列化后變成了有效的JSON字串,然后經過決議又在mesCopy中還原為一個Date物件,還原函式在遇到releaseDate鍵時,會基于相應的值創建一個新的Date物件,結果就是mesCopy.releaseDate屬性會保存一個Date物件,正因為如此,才能基于這個物件呼叫getFullYear()方法,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/377106.html

標籤:其他

上一篇:[移動端]視口與媒體查詢

下一篇:七天學完JavaScript(day03)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more