目錄
#JSON基本語法
簡單型別值
對象
陣列
JSON解析與序列化
JSON物件
stringify序列化
過濾器
數組過濾器
#函數過濾器
缩进
空格填充
字符填充
toJSON()方法
序列化对象顺序
parse解析
小结
首頁 web前端 js教程 輕量級資料格式—JSON

輕量級資料格式—JSON

Feb 28, 2017 pm 03:09 PM

今天這數學實在看不下去 

來換換腦子,寫寫前端
今天就寫一個小知識JSON


在很久很久以前,XML是互聯網上傳輸資料的標準
但是大家普遍反映XML太繁瑣
再後來,隨著Web的發展
人們發現JSON作為JavaScript語法的子集使用更方便
於是JSON就成為了標準
現在大家都把JSON當作通訊的資料格式

#JSON基本語法

(JSON:JavaScript Object Notation,JavaScript對象表示法)
JSON語法大體分為三種類型值

  • 簡單型別值:可表示字串、數字、布林值和null

  • #物件:複雜資料類型,表示無序鍵值對

  • 陣列:複雜資料類型,表示有序值清單

注意JSON不支援undefined、不支援函數

簡單型別值

單獨的基本型別值也可以看做JSON
語法與JavaScript相同
只有一點要注意
在我們JavaScript中字串可以用雙引號表示,也可以用單引號表示
但是JSON中的字串格式必須使用雙引號

對象

由於JSON是JavaScript語法的子集
所以我主要說一下不太一樣的地方
先看一下我們常用的物件字面量聲明格式

var man = {
    name: 'payen',
    sex: 'male',
    age: 19};
登入後複製

我們JavaScript中對象可以給屬性加引號也可以不加
(為了區分普通對象與JSON對象,通常不加引號)
但在JSON中對像要求給屬性加(雙)引號
我們上面的物件在JavaScript中也可以這麼寫,完全等價

var man = {    "name": "payen",    "sex": "male",    "age": 19};
登入後複製

而用JSON表示上面的物件就是

{
    "name": "payen",
    "sex": "male",
    "age": 19}
登入後複製

(JSON中沒有變數的概念,沒有分號)
當然JSON中物件的值也可以是物件
不管多麼複雜的JSON,物件的鍵(屬性)都要加(雙)引號

陣列

雖然在我們JavaScript中,陣列嚴格來說屬於物件
但我們通常都會把它們區別對待
我們通用的宣告陣列字面量的方法

var value = [123, 'abc', true];
登入後複製

JSON也是相同的語法

[123, "abc", true]
登入後複製

再次強調,JSON沒有變數和分號


通常來說,陣列和物件是JSON的最外層形式
透過陣列、物件以及簡單型別值能夠建構各式各樣的JSON數據格式

JSON解析與序列化

JSON之所以流行,更重要的原因
便是它更容易解析為有用的物件

JSON物件

很早之前的JSON解析器用的是JavaScript的eval()
但是它是有風險的,可能會執行惡意程式碼
ES5規範了解析JSON的行為
定義了全域對象JSON
它有兩個方法

  • stringify()
    JavaScript物件–> JSON字串

  • parse()
    JSON字串–> JavaScript物件

最最基本的用法當然就是
我們把要轉換的變數當作參數穿進去
舉個例子(這個範例會一直用)

var man = {    &#39;name&#39;: "payen", <--
    sex: "male", <--
    "age": 19,    "school": {        "name": &#39;HUST&#39;,        "sex": undefined, <--
        "location": function(){} <--
    }
}
var str = JSON.stringify(man);
console.log(str);
console.log(typeof str);
登入後複製

下面我們看看控制台列印

#可以看到JSON.stringify真的回傳了JSON字串
我們無引號還有單引號的屬性在JSON字串中都變成了雙引號
並且屬性值為undefined或函數的屬性被自動忽略了
(原型成員更是被忽略掉)

雖然JSON.stringify()在物件中遇到undefined、function(也包括ES6的symbol)會自動被忽略
但是數組不一樣
數組沒有物件絕情把它們一腳踢開,而是返回null

console.log(JSON.stringify([123, undefined, null, function(){}]));
登入後複製


我們可以用JSON.parse還原為JavaScript物件

console.log(JSON.parse(str));
登入後複製
登入後複製

下面我們來看看這兩個函數更深的用法

stringify序列化

這個方法除了填待序列化物件之外,還可以接受兩個參數
其一是一個過濾器,可以是數組,也可以是函數
其二是可以指定JSON字串的縮排

過濾器

數組過濾器

數組的形式比較簡單,我們可以指定我們想要的物件屬性
還是我們上面的範例

var str = JSON.stringify(man,[&#39;name&#39;,&#39;sex&#39;]);
console.log(str);
登入後複製

#函數過濾器

我們傳入的函數接收連個參數,鍵(屬性名)與值(屬性值)
傳回的值就是對應鍵的值
若函數傳回undefined,屬性會被忽略

var str = JSON.stringify(man, function(key, value){
    if(key == &#39;name&#39;){        return &#39;abc&#39;;
    }    if(key == &#39;sex&#39;){        return;
    }    return value;
});
console.log(str);
登入後複製


注意这里最后一定要写return value; 才能正常显示其他值
如果使用了switch语句就写default: return value;

缩进

空格填充

另一个参数可以填写数字指定缩进的空格数(最大缩进10)

var str = JSON.stringify(man, null, 4);
console.log(str);
登入後複製

字符填充

我们也可以指定缩进字符

var str = JSON.stringify(man, null, "- - ");
console.log(str);
登入後複製

toJSON()方法

可能有些时候stringify不够满足我们的需求
这时我们可以给对象定义toJSON()方法
(但仍然是调用stringify()方法)
返回自身的JSON的数据格式
原生Date对象有默认toJSON()返回日期字符串(同Date中方法toISOString()结果相同)

我们可以给我们的对象添加一个toJSON属性

var man = {    ...,
    toJSON: function(){        return this.school;
    }
}
var str = JSON.stringify(man);
console.log(str);
登入後複製

这里再多说一句
很多同学误认为toJSON()返回的是JSON字符串
其实不是的
toJSON()返回的应该是一个适当的值,然后由JSON.stringify()对其进行序列化
所以toJSON()是返回一个能够被字符串化的安全JSON值
下面我们来看看调用JSON.stringify()发生了什么

序列化对象顺序

  • 如果对象有toJSON()并且能获得有效值,优先调用,否则返回对象本身

  • 若有第二个参数,对上一步返回的对象应用过滤器

  • 对上一步返回的每个值进行相应序列化

  • 若有第三个参数,执行序列化

parse解析

JSON.parse也可以接受另一个参数,它是一个函数
类似于上面序列化中过滤器的过滤函数
它被称作还原函数,同样接受键和值作为参数
首先我现在我们例子中的对象添加一个方法

var man = {    ...,
    releaseDate: new Date(2016,11,11)
}
var str = JSON.stringify(man);
console.log(str);
登入後複製


我们看到,由于Date对象存在toJSON()
序列化之后调用了toJSON()
我们看到了这样的字符串

console.log(JSON.parse(str));
登入後複製
登入後複製


这样的数据不是我们想要的
这样的情况我们怎么处理呢?
答案是使用还原函数


可以这样做

var msg = JSON.parse(str,function(key, value){
    if(key == &#39;releaseDate&#39;){        return new Date(value);
    }else{        return value;
    }
})
console.log(msg.releaseDate.getFullYear(),
            msg.releaseDate.getMonth(),
            msg.releaseDate.getDate());
登入後複製

这样我们就可以使用得到的时间数据了

小结

没想到写了这么多
JSON其实很简单
就是一个轻量级的数据格式
可以简化表示复杂数据结构的工作量
主要要掌握ES5的全局对象JSON中的两个方法JSON.stringify()和JSON.parse()
总结几个要记住的重点

  • JSON.stringify()
    用于把JavaScript对象转换为JSON字符串
    可填写额外两个参数-筛选数组/替换函数和指定缩进

    • 对象遇到undefined、function、symbol(ES6)会忽略

    • 数组遇到undefined、function、symbol(ES6)会返回null

  • JSON.parse()
    用于把JSON字符串转换为JavaScript对象
    可填写额外一个参数-还原函数

 以上就是轻量级数据格式——JSON的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

golang WebSocket與JSON的結合:實現資料傳輸與解析 golang WebSocket與JSON的結合:實現資料傳輸與解析 Dec 17, 2023 pm 03:06 PM

golangWebSocket與JSON的結合:實現資料傳輸和解析在現代的Web開發中,即時資料傳輸變得越來越重要。 WebSocket是一種用於實現雙向通訊的協議,與傳統的HTTP請求-回應模型不同,WebSocket允許伺服器向客戶端主動推送資料。而JSON(JavaScriptObjectNotation)是一種用於資料交換的輕量級格式,它簡潔易讀

適用於低階或較舊電腦的最佳輕量級Linux發行版 適用於低階或較舊電腦的最佳輕量級Linux發行版 Mar 06, 2024 am 09:49 AM

正在尋找完美的Linux發行版,為舊的或低階電腦注入新的活力嗎?如果是的話,那麼你來對地方了。在本文中,我們將探索一些輕量級Linux發行版的首選,這些發行版是專門為較舊或功能較弱的硬體量身定做的。無論這樣做背後的動機是重振老舊的設備,還是只是在預算內最大化性能,這些輕量級選項肯定能滿足需求。為什麼要選擇輕量級的Linux發行版?選擇輕量級Linux發行版有幾個優點,第一個優點是在最少的系統資源上獲得最佳效能,這使得它們非常適合處理能力、RAM和儲存空間有限的舊硬體。除此之外,與較重的資源密集

MySQL5.7和MySQL8.0的差別是什麼? MySQL5.7和MySQL8.0的差別是什麼? Feb 19, 2024 am 11:21 AM

MySQL5.7和MySQL8.0是兩個不同的MySQL資料庫版本,它們之間有以下一些主要差異:效能改進:MySQL8.0相對於MySQL5.7有一些效能改進。其中包括更好的查詢優化器、更有效率的查詢執行計劃產生、更好的索引演算法和平行查詢等。這些改進可以提高查詢效能和整體系統效能。 JSON支援:MySQL8.0引入了對JSON資料類型的原生支持,包括JSON資料的儲存、查詢和索引。這使得在MySQL中處理和操作JSON資料變得更加方便和有效率。事務特性:MySQL8.0引進了一些新的事務特性,如原子

PHP 數組轉 JSON 的效能最佳化技巧 PHP 數組轉 JSON 的效能最佳化技巧 May 04, 2024 pm 06:15 PM

PHP數組轉JSON的效能最佳化方法包括:使用JSON擴充和json_encode()函數;新增JSON_UNESCAPED_UNICODE選項以避免字元轉義;使用緩衝區提高循環編碼效能;快取JSON編碼結果;考慮使用第三方JSON編碼庫。

使用golang中的json.MarshalIndent函數將結構體轉換為格式化的JSON字串 使用golang中的json.MarshalIndent函數將結構體轉換為格式化的JSON字串 Nov 18, 2023 pm 01:59 PM

使用golang中的json.MarshalIndent函數將結構體轉換為格式化的JSON字串在使用Golang編寫程式時,我們經常需要將結構體轉換為JSON字串,在這個過程中,json.MarshalIndent函數可以幫助我們實現格式化的輸出。下面我們將詳細介紹如何使用這個函數,並提供具體的程式碼範例。首先,讓我們建立一個包含一些資料的結構體。以下是示

C#開發中如何處理XML和JSON資料格式 C#開發中如何處理XML和JSON資料格式 Oct 09, 2023 pm 06:15 PM

C#開發中如何處理XML和JSON資料格式,需要具體程式碼範例在現代軟體開發中,XML和JSON是廣泛應用的兩種資料格式。 XML(可擴展標記語言)是一種用於儲存和傳輸資料的標記語言,而JSON(JavaScript物件表示)是一種輕量級的資料交換格式。在C#開發中,我們經常需要處理和操作XML和JSON數據,本文將重點放在如何使用C#處理這兩種數據格式,並附上

Pandas使用教學:讀取JSON檔案的快速入門 Pandas使用教學:讀取JSON檔案的快速入門 Jan 13, 2024 am 10:15 AM

快速入門:Pandas讀取JSON檔案的方法,需要具體程式碼範例引言:在資料分析和資料科學領域,Pandas是一個重要的Python庫之一。它提供了豐富的功能和靈活的資料結構,能夠方便地對各種資料進行處理和分析。在實際應用中,我們經常會遇到需要讀取JSON檔案的情況。本文將介紹如何使用Pandas來讀取JSON文件,並附上特定的程式碼範例。一、Pandas的安裝

Jackson庫中註解如何控制JSON序列化和反序列化? Jackson庫中註解如何控制JSON序列化和反序列化? May 06, 2024 pm 10:09 PM

Jackson庫中的註解可控制JSON序列化和反序列化:序列化:@JsonIgnore:忽略屬性@JsonProperty:指定名稱@JsonGetter:使用獲取方法@JsonSetter:使用設定方法反序列化:@JsonIgnoreProperties:忽略屬性@ JsonProperty:指定名稱@JsonCreator:使用建構子@JsonDeserialize:自訂邏輯

See all articles