者 | 豬哥
責編 | maozz
JSON的誕生原因是因為XML整合到HTML中各個瀏覽器實現(xiàn)的細節(jié)不盡相同,所以道格拉斯·克羅克福特(Douglas Crockford) 和 奇普·莫寧斯達(Chip Morningstar)一起從JS的數(shù)據(jù)類型中提取了一個子集,作為新的數(shù)據(jù)交換格式,因為主流的瀏覽器使用了通用的JavaScript引擎組件,所以在解析這種新數(shù)據(jù)格式時就不存在兼容性問題,于是他們將這種數(shù)據(jù)格式命名為 “JavaScript Object Notation”,縮寫為 JSON,由此JSON便誕生了!
今天我們來學習一下JSON的結構形式、數(shù)據(jù)類型、使用場景以及注意事項吧!
JSON格式
上面我們知道JSON是從JavaScript的數(shù)據(jù)類型中提取出來的子集,那JSON有幾種結構形式呢?又有哪些數(shù)據(jù)類型呢?他們又分別對應著JavaScript中的哪些數(shù)據(jù)類型呢?
JSON的2種結構形式,鍵值對形式和數(shù)組形式。
舉了一個JSON的實例,就是鍵值對形式的,如下:
{
"person": {
"name": "pig",
"age": "18",
"sex": "man",
"hometown": {
"province": "江西省",
"city": "撫州市",
"county": "崇仁縣"
}
}
}
這種結構的JSON數(shù)據(jù)規(guī)則是:一個無序的“‘名稱/值’對”集合。一個對象以 {左括號 開始, }右括號 結束。每個“名稱”后跟一個 :冒號 ;“‘名稱/值’ 對”之間使用 ,逗號 分隔。
因為大多數(shù)的時候大家用的JSON可能都是上面那種key-value形式,所以很多人在講解JSON的時候總是會忽略數(shù)組形式,這一點是需要注意的。
那JSON的數(shù)組形式是怎么樣的呢?舉一個實例吧!
["pig", 18, "man", "江西省撫州市崇仁縣"]
數(shù)組形式的JSON數(shù)據(jù)就是值(value)的有序集合。一個數(shù)組以 [左中括號 開始, ]右中括號 結束。值之間使用 ,逗號 分隔。
JOSN的6種數(shù)據(jù)類型
上面兩種JSON形式內(nèi)部都是包含value的,那JSON的value到底有哪些類型,而且上期我們說JSON其實就是從Js數(shù)據(jù)格式中提取了一個子集,那具體有哪幾種數(shù)據(jù)類型呢?
string:字符串,必須要用雙引號引起來。
number:數(shù)值,與JavaScript的number一致,整數(shù)(不使用小數(shù)點或指數(shù)計數(shù)法)最多為 15 位,小數(shù)的最大位數(shù)是 17。
object:JavaScript的對象形式,{ key:value }表示方式,可嵌套。
array:數(shù)組,JavaScript的Array表示方式[ value ],可嵌套。
true/false:布爾類型,JavaScript的boolean類型。
:空值,JavaScript的。
以上數(shù)據(jù)形式圖片來源JSON官方文檔:http://www.json.org/json-zh.html
JSON使用場景
介紹完JSON的數(shù)據(jù)格式,那我們來看看JSON在企業(yè)中使用的比較多的場景。
接口返回數(shù)據(jù)和序列化。JSON用的最多的地方莫過于Web了,現(xiàn)在的數(shù)據(jù)接口基本上都是返回的JSON,具體細化的場景有:
Ajxa異步訪問數(shù)據(jù)
RPC遠程調用
前后端分離后端返回的數(shù)據(jù)
開放API,如百度、高德等一些開放接口
企業(yè)間合作接口
這種API接口一般都會提供一個接口文檔,說明接口的入?yún)ⅰ⒊鰠⒌龋?/p>
一般的接口返回數(shù)據(jù)都會封裝成JSON格式,比如類似下面這種
{
"code": 1,
"msg": "success",
"data": {
"name": "pig",
"age": "18",
"sex": "man",
"hometown": {
"province": "江西省",
"city": "撫州市",
"county": "崇仁縣"
}
}
}
程序在運行時所有的變量都是保存在內(nèi)存當中的,如果出現(xiàn)程序重啟或者機器宕機的情況,那這些數(shù)據(jù)就丟失了。一般情況運行時變量并不是那么重要丟了就丟了,但有些內(nèi)存中的數(shù)據(jù)是需要保存起來供下次程序或者其他程序使用。
保存內(nèi)存中的數(shù)據(jù)要么保存在數(shù)據(jù)庫,要么保存直接到文件中,而將內(nèi)存中的數(shù)據(jù)變成可保存或可傳輸?shù)臄?shù)據(jù)的過程叫做序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是一個意思。
正常的序列化是將編程語言中的對象直接轉成可保存或可傳輸?shù)模@樣會保存對象的類型信息,而JSON序列化則不會保留對象類型!
為了讓大家更直觀的感受區(qū)別,豬哥用代碼做一個測試,大家一目了然
Python對象直接序列化會保存class信息,下次使用loads加載到內(nèi)存時直接變成Python對象。
JSON對象序列化只保存屬性數(shù)據(jù),不保留class信息,下次使用loads加載到內(nèi)存可以直接轉成dict對象,當然也可以轉為Person對象,但是需要寫輔助方法。
對于JSON序列化不能保存class信息的特點,那JSON序列化還有什么用?答案是當然有用,對于不同編程語言序列化讀取有用,比如:我用Python爬取數(shù)據(jù)然后轉成對象,現(xiàn)在我需要將它序列化磁盤,然后使用Java語言讀取這份數(shù)據(jù),這個時候由于跨語言數(shù)據(jù)類型不同,所以就需要用到JSON序列化。
存在即合理,兩種序列化可根據(jù)需求自行選擇!
最后就是生成Token和配置文件
首先聲明Token的形式多種多樣,有JSON、字符串、數(shù)字等等,只要能滿足需求即可,沒有規(guī)定用哪種形式。
JSON格式的Token最有代表性的莫過于JWT(JSON Web Tokens)。
隨著技術的發(fā)展,分布式web應用的普及,通過Session管理用戶登錄狀態(tài)成本越來越高,因此慢慢發(fā)展成為Token的方式做登錄身份校驗,然后通過Token去取Redis中的緩存的用戶信息,隨著之后JWT的出現(xiàn),校驗方式更加簡單便捷化,無需通過Redis緩存,而是直接根據(jù)Token取出保存的用戶信息,以及對Token可用性校驗,單點登錄更為簡單。
使用JWT做過app的登錄系統(tǒng),大概的流程就是:
用戶輸入用戶名密碼
app請求登錄中心驗證用戶名密碼
如果驗證通過則生成一個Token,其中Token中包含:
用戶的uid、Token過期時間、過期延期時間等,然后返回給app
app獲得Token,保存在cookie中,下次請求其他服務則帶上
其他服務獲取到Token之后調用登錄中心接口驗證
驗證通過則響應
JWT登錄認證有哪些優(yōu)勢:
性能好:服務器不需要保存大量的session
單點登錄(登錄一個應用,同一個企業(yè)的其他應用都可以訪問):使用JWT做一個登錄中心基本搞定,很容易實現(xiàn)。
兼容性好:支持移動設備,支持跨程序調用,Cookie 是不允許垮域訪問的,而 Token 則不存在這個問題。
安全性好:因為有簽名,所以JWT可以防止被篡改。更多JWT相關知識自行在網(wǎng)上學習,本文不過多介紹!
說實話JSON作為配置文件使用場景并不多,最具代表性的就是npm的package.json包管理配置文件了,下面就是一個npm的package.json配置文件內(nèi)容。
{
"name": "server", //項目名稱
"version": "0.0.0",
"private": true,
"main": "server.js", //項目入口地址,即執(zhí)行npm后會執(zhí)行的項目
"scripts": {
"start": "node ./bin/www" ///scripts指定了運行腳本命令的npm命令行縮寫
},
"dependencies": {
"cookie-parser": "~1.4.3", //指定項目開發(fā)所需的模塊
"debug": "~2.6.9",
"express": "~4.16.0",
"http-errors": "~1.6.2",
"jade": "~1.11.0",
"morgan": "~1.9.0"
}
}
但其實JSON并不合適做配置文件,因為它不能寫注釋、作為配置文件的可讀性差等原因。
配置文件的格式有很多種如:toml、yaml、xml、ini等,目前很多地方開始使用yaml作為配置文件格式。
JSON在Python中的使用
最后我們來看看Python中操作JSON的常用方法有哪些,在Python中操作JSON時需要引入json標準庫。
import json
類型轉換
Python類型轉JSON:json.dump
# 1、Python的dict類型轉JSON
person_dict = {'name': 'pig', 'age': 18, 'sex': 'man', 'hometown': '江西撫州'}
# indent參數(shù)為縮進空格數(shù)
person_dict_json = json.dumps(person_dict, indent=4)
print(person_dict_json, '\n')
# 2、Python的列表類型轉JSON
person_list = ['pig', 18, 'man', '江西撫州']
person_list_json = json.dumps(person_list)
print(person_list_json, '\n')
# 3、Python的對象類型轉JSON
person_obj = Person('pig', 18, 'man', '江西撫州')
# 中間的匿名函數(shù)是獲得對象所有屬性的字典形式
person_obj_json = json.dumps(person_obj, default=lambda obj: obj.__dict__, indent=4)
print(person_obj_json, '\n')
執(zhí)行結果:
JSON轉Python類型:json.loads
# 4、JSON轉Python的dict類型
person_json = '{ "name": "pig","age": 18, "sex": "man", "hometown": "江西撫州"}'
person_json_dict = json.loads(person_json)
print(type(person_json_dict), '\n')
# 5、JSON轉Python的列表類型
person_json2 = '["pig", 18, "man", "江西撫州"]'
person_json_list = json.loads(person_json2)
print(type(person_json_list), '\n')
# 6、JSON轉Python的自定義對象類型
person_json = '{ "name": "pig","age": 18, "sex": "man", "hometown": "江西撫州"}'
# object_hook參數(shù)是將dict對象轉成自定義對象
person_json_obj = json.loads(person_json, object_hook=lambda d: Person(d['name'], d['age'], d['sex'], d['hometown']))
print(type(person_json_obj), '\n')
執(zhí)行結果如下:
對應的數(shù)據(jù)類型
上面我們演示了Python類型與JSON的相互轉換,最開始的時候我們講過JSON有6種數(shù)據(jù)類型,那這6種數(shù)據(jù)類型分別對應Python中的哪些數(shù)據(jù)類型呢?
需要注意的點
JSON的鍵名和字符串都必須使用雙引號引起來,而Python中單引號也可以表示為字符串,所以這是個比較容易犯的錯誤!
Python類型與JSON相互轉換的時候到底是用load/dump還是用loads\dumps?
他們之間有什么區(qū)別?
什么時候該加s什么時候不該加s?
這個我們可以通過查看源碼找到答案:
不加s的方法入?yún)⒍嗔艘粋€fp表示filepath,最后多了一個寫入文件的操作。
所以我們在記憶的時候可以這樣記憶:
加s表示轉成字符串(str),不加s表示轉成文件。
Python自定義對象與JSON相互轉換的時候需要輔助方法來指明屬性與鍵名的對應關系,如果不指定一個方法則會拋出異常!
相信有些看的仔細的同學會好奇上面使用json.dumps方法將Python類型轉JSON的時候,如果出現(xiàn)中文,則會出現(xiàn):
\u6c5f\u897f\u629a\u5dde
這種東西,這是為什么呢?
原因是:Python 3中的json在做dumps操作時,會將中文轉換成unicode編碼,并以16進制方式存儲,而并不是UTF-8格式!
總結
今天我們學習了JSON的2種形式,切記JSON還有[...]這種形式的。
學習了JSON的6種數(shù)據(jù)類型他們分別對于Python中的哪些類型。
了解了JSON的一些使用場景以及實際的例子。
還學習了在Python中如何使用JSON以及需要注意的事項。
一個JSON知識點卻分兩篇長文(近萬字)來講,其重要性不言而喻。因為不管你是做爬蟲、還是做數(shù)據(jù)分析、web、甚至前端、測試、運維,JSON都是你必須要掌握的一個知識點
本文為作者投稿,版權歸作者個人所有。
SON 是用于存儲和傳輸數(shù)據(jù)的格式。
JSON 通常用于服務端向網(wǎng)頁傳遞數(shù)據(jù) 。
什么是 JSON?
JSON 英文全稱 JavaScript Object Notation
JSON 是一種輕量級的數(shù)據(jù)交換格式。
JSON是獨立的語言 *
JSON 易于理解。
JSON 實例
以下 JSON 語法定義了 sites 對象: 3 條網(wǎng)站信息(對象)的數(shù)組:
JSON 實例
{"sites":[{"name":"Runoob", "url":"www.runoob.com"}, {"name":"Google", "url":"www.google.com"}, {"name":"Taobao", "url":"www.taobao.com"}]}
JSON 格式化后為 JavaScript 對象
JSON 格式在語法上與創(chuàng)建 JavaScript 對象代碼是相同的。
由于它們很相似,所以 JavaScript 程序可以很容易的將 JSON 數(shù)據(jù)轉換為 JavaScript 對象。
JSON 語法規(guī)則
數(shù)據(jù)為 鍵/值 對。
數(shù)據(jù)由逗號分隔。
大括號保存對象
方括號保存數(shù)組
JSON 數(shù)據(jù) - 一個名稱對應一個值
JSON 數(shù)據(jù)格式為 鍵/值 對,就像 JavaScript 對象屬性。
鍵/值對包括字段名稱(在雙引號中),后面一個冒號,然后是值:
"name":"Runoob"
JSON 對象
JSON 對象保存在大括號內(nèi)。
就像在 JavaScript 中, 對象可以保存多個 鍵/值 對:
{"name":"Runoob", "url":"www.runoob.com"}
JSON 數(shù)組
JSON 數(shù)組保存在中括號內(nèi)。
就像在 JavaScript 中, 數(shù)組可以包含對象:
"sites":[{"name":"Runoob", "url":"www.runoob.com"}, {"name":"Google", "url":"www.google.com"}, {"name":"Taobao", "url":"www.taobao.com"}]
在以上實例中,對象 "sites" 是一個數(shù)組,包含了三個對象。
每個對象為站點的信息(網(wǎng)站名和網(wǎng)站地址)。
JSON 字符串轉換為 JavaScript 對象
通常我們從服務器中讀取 JSON 數(shù)據(jù),并在網(wǎng)頁中顯示數(shù)據(jù)。
簡單起見,我們網(wǎng)頁中直接設置 JSON 字符串 (你還可以閱讀我們的 JSON 教程):
首先,創(chuàng)建 JavaScript 字符串,字符串為 JSON 格式的數(shù)據(jù):
vartext = '{ "sites" : [' +'{ "name":"Runoob" , "url":"www.runoob.com" },' +'{ "name":"Google" , "url":"www.google.com" },' +'{ "name":"Taobao" , "url":"www.taobao.com" } ]}';
然后,使用 JavaScript 內(nèi)置函數(shù) JSON.parse() 將字符串轉換為 JavaScript 對象:
var obj = JSON.parse(text);
最后,在你的頁面中使用新的 JavaScript 對象:
實例
vartext = '{ "sites" : [' + '{ "name":"Runoob" , "url":"www.runoob.com" },' + '{ "name":"Google" , "url":"www.google.com" },' + '{ "name":"Taobao" , "url":"www.taobao.com" } ]}'; obj = JSON.parse(text);document.getElementById("demo").innerHTML = obj.sites[1].name + "" + obj.sites[1].url;
* JSON 使用 JavaScript 語法,但是 JSON 格式僅僅是一個文本。
文本可以被任何編程語言讀取及作為數(shù)據(jù)格式傳遞。
SON(JavaScript Object Notation)是一種通用的、輕量級的數(shù)據(jù)交換格式,而不是編程語言。由于 XML 過于冗余和啰嗦, 因此,使用 JSON 代替 XML 進行網(wǎng)絡傳輸。
一個 JSON 對象可以被儲存在它自己的文件中,這基本上就是一個文本文件,擴展名為 .json。
基本上 JSON 對象就是基于 JavaScript 對象,因此,可以把 JavaScript 對象寫入 JSON 數(shù)據(jù),JSON 可以將JavaScript對象分為三類:
而在JSON中,使用如下語法規(guī)則:
{
"code": 1,
"status": true,
"msg": "Http Request Success",
"data": [
{
“id”: 2011101010,
"name": "小趙",
"age": 29,
"sex": "男",
"birthday": “1992-04-09”,
"address": [
"北京市通州區(qū)萬達廣場",
"天津市",
"河北省邯鄲市"
]
},
{
“id”: 2011101011,
"name": "小錢",
"age": 27,
"sex": "男",
"birthday": “1994-05-01”,
"address": [
"北京市通州區(qū)萬達廣場",
"天津市",
"河北省邯鄲市"
]
},
{
“id”: 2011101013,
"name": "小玲",
"age": 28,
"sex": "女",
"birthday": “1993-09-26”,
"address": [
"北京市通州區(qū)萬達廣場",
"天津市",
"河北省邯鄲市"
]
}
]
}
注意:JSON 簡單值中的字符串必須使用雙引號標記,因為使用單引號會導致語法錯誤。
ECMAScipt 5 添加了用于JSON解析與序列化的 JSON 對象,該對象只包含兩個方法:
下面詳細介紹這兩種方法。
JSON.stringify() 方法將一個JavaScript簡單值、對象或數(shù)組轉換為JSON字符串。如果指定一個 replacer 函數(shù),則可以選擇性地替換掉,或者指定的 replacer 的數(shù)組,則可選擇性地僅包含數(shù)組指定的屬性。
stringify(value, replacer, space): string;
let student = {
id: 2011101011,
name: "小錢",
age: 27,
sex: undefined,
birthday: new Date(1994, 5, 1),
address: [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
]
};
let json = JSON.stringify(student);
使用 JSON.stringify() 在默認情況下會輸出不包含空格或縮進的 JSON 字符串。如下是輸出的 JSON 字符串結果:
{"id":2011101011,"name":"小錢","age":27,"birthday":"1994-05-31T16:00:00.000Z","address":["北京市通州區(qū)萬達廣場","天津市","河北省邯鄲市"]}
而在序列化時,會有意地將所有函數(shù)和原型對象在結果中省略。
注意:值為 undefined 的任何屬性都會被省略。
如果 replacer 是一個函數(shù),則在序列化過程中,被序列化的值的每個屬性都會經(jīng)過該函數(shù)的轉換和處理;如果該參數(shù)是一個數(shù)組,則只有包含在這個數(shù)組中的屬性名才會被序列化到最終的 JSON 字符串中;如果該參數(shù)為 null 或者未提供,則對象所有的屬性都會被序列化。
JSON.stringify() 方法的 replacer 參數(shù)用于轉換結果。
如果 replacer 是一個數(shù)組,那 JSON.stringify() 返回的結果只會包含數(shù)組中列出的對象屬性。如下所示:
let student = {
id: 2011101011,
name: "小錢",
age: 27,
sex: undefined,
birthday: new Date(1994, 5, 1),
address: [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
]
};
let json = JSON.stringify(student, ["name", "address"]);
上面的例子,輸出的結果會根據(jù)第二個參數(shù)傳入的數(shù)組 ["name", "address"] 來獲取對應 name 和 address 屬性及它們的值進行序列化:
{"name":"小錢","address":["北京市通州區(qū)","浙江省杭州市","河北省邯鄲市"]}
如果 replacer 是一個函數(shù),它將有鍵 key 和值 value 兩個參數(shù),且根據(jù)函數(shù)進行相應的序列化操作,且函數(shù)返回值應當是JSON中key對應的value值。 key 始終是字符串,只在值不屬于某個key時,才會是空字符串。如下所示:
let student = {
id: 2011101011,
name: "小錢",
age: 27,
sex: undefined,
birthday: new Date(1994, 5, 1),
address: [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
]
};
let json = JSON.stringify(student, (key, value) => {
console.log(typeof value);
if (key == "address") {
return value.join(",");
}
if (key == "birthday") {
return undefined;
}
return value; // 一定要提供該默認返回值,以返回其它屬性傳入的值。
});
最終得到的JSON 字符串是這樣的:
{"id":2011101011,"name":"小錢","age":27,"address":"北京市通州區(qū),浙江省杭州市,河北省邯鄲市"}
注意:使用 replacer 序列化得到的JSON在使用parse進行解析,就只會得到JSON中的屬性。
space 參數(shù)用于控制縮進和空格。當該參數(shù)為數(shù)值時,表示每一級縮進的空格數(shù)。如下所示:
let student = {
id: 2011101011,
name: "小錢",
age: 27,
sex: undefined,
birthday: new Date(1994, 5, 1),
address: [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
]
}
let json = JSON.stringify(student, null, 4);
輸出的 JSON 格式如下所示:
{
"id": 2011101011,
"name": "小錢",
"age": 27,
"birthday": "1994-05-31T16:00:00.000Z",
"address": [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
]
}
注意:除了縮進,JSON.stringify() 方法還很方便地插入了換行符。最大縮進值為 10,大于 10 的值自動設置為 10;最小縮進值為 1,小于 1 的值意味著沒有縮進字符。
當該參數(shù)為字符串時,將指定該字符串為空格;如果沒有提供,或者值為 null,將沒有空格。若兩個連字符:
let student = {
id: 2011101011,
name: "小錢",
age: 27,
sex: undefined,
birthday: new Date(1994, 5, 1),
address: [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
]
}
let json = JSON.stringify(student, null, "--");
輸出的 JSON 格式如下:
{
--"id": 2011101011,
--"name": "小錢",
--"age": 27,
--"birthday": "1994-05-31T16:00:00.000Z",
--"address": [
----"北京市通州區(qū)",
----"浙江省杭州市",
----"河北省邯鄲市"
--]
}
也可以使用空格 " " 、制表符 '\t' 或 Tab來設置縮進字符。如下所示:
let student = {
id: 2011101011,
name: "小錢",
age: 27,
sex: undefined,
birthday: new Date(1994, 5, 1),
address: [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
]
}
let json = JSON.stringify(student, null, '\t');
輸出的 JSON 格式如下:
{
"id": 2011101011,
"name": "小錢",
"age": 27,
"birthday": "1994-05-31T16:00:00.000Z",
"address": [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
]
}
注意:使用字符串時同樣有 10 個字符的長度限制。如果字符串長度超過 10,則會在第 10 個字符處截斷。
如果對象之中定義了 toJSON() 方法,JSON.stringify() 就會調用該對象的 toJSON() 方法,覆蓋默認序列化行為。如下所示:
let student = {
id: 2011101011,
name: "小錢",
age: 27,
sex: undefined,
birthday: new Date(1994, 5, 1),
address: [
"北京市通州區(qū)",
"浙江省杭州市",
"河北省邯鄲市"
],
toJSON: function () {
return {
name: this.name,
age: this.age
};
}
}
let json = JSON.stringify(student, null, " ");
輸出的 JSON 格式如下:
{
"name": "小錢",
"age": 27
}
toJSON() 方法可以返回任意序列化值,都可以起到相應的作用。
注意:箭頭函數(shù)不能用來定義toJSON()方法。主要原因是箭頭函數(shù)的詞法作用域是全局作用域,在這種情況下不適合。
toJSON() 方法可以與 replacer 一起使用,因此,序列化流程的順序非常重要。在把對象傳給 JSON.stringify() 時會執(zhí)行如下步驟。
理解這個順序有助于決定是創(chuàng)建 toJSON() 方法,還是使用replacer函數(shù),抑或是兩者都用。
JSON.parse() 方法用來解析 JSON 字符串,構造由字符串描述的 JavaScript 值或對象。提供可選的 reviver 函數(shù)用以在返回之前對所得到的對象執(zhí)行變換(操作)。
parse(text, reviver): any;
let json = '{' +
'"id":2011101011,' +
'"name":"小錢",' +
'"age":27,' +
'"birthday":"1994-05-31T16:00:00.000Z",' +
'"address":[' +
'"北京市通州區(qū)",' +
'"浙江省杭州市",' +
'"河北省邯鄲市"' +
']' +
'}'
let student = JSON.parse(json);
輸出的對象為:
{
id: 2011101011,
name: '小錢',
age: 27,
birthday: '1994-05-31T16:00:00.000Z',
address: [ '北京市通州區(qū)', '浙江省杭州市', '河北省邯鄲市' ]
}
注意:如果給 JSON.parse() 傳入的 JSON 字符串無效,則會拋出異常。
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017,
releaseDate: new Date(2017, 11, 1)
};
let jsonText = JSON.stringify(book);
let bookCopy = JSON.parse(jsonText,
(key, value) => key == "releaseDate" ? new Date(value) : value);
alert(bookCopy.releaseDate.getFullYear());
reviver 參數(shù)是一個還原函數(shù),如果指定了還原函數(shù),將解析出的 JavaScript 值經(jīng)過一次轉換后返回最終值。該函數(shù)的調用時機在 parse 函數(shù)返回之前,并接收 key 和 value 兩個參數(shù)。如果返回 undefined,結果會刪除與 undefined 相對應的 key;而返回其它值,則該值會成為相應鍵的值并插入到返回結果中。
let json = '{' +
'"id":2011101011,' +
'"name":"小錢",' +
'"age":27,' +
'"birthday":"1994-05-31T16:00:00.000Z",' +
'"address":[' +
'"北京市通州區(qū)",' +
'"浙江省杭州市",' +
'"河北省邯鄲市"' +
']' +
'}'
let student = JSON.parse(json, (key, value) => {
if (key == "birthday") {
return new Date(value);
}
return value;
});
在上面的代碼中,JSON.parse() 方法中,定義了一個還原函數(shù),獲取 birthday 鍵并重新創(chuàng)建新的 Date 對象。最后, student.birthday 屬性變成了 Date 對象,可以調用有關 Date 類的方法了。
通過上面的簡單介紹,JSON 這種數(shù)據(jù)結構可以很方便地表示復雜的數(shù)據(jù)結構,如 JavaScript 中的數(shù)字、字符串、布爾值、數(shù)組、對象和 null 都可以用 JSON 格式表示。且比 XML 更加輕量級。而且,現(xiàn)代瀏覽器都已經(jīng)原生支持全局 JSON 對象,并且使用 JSON.stringify() 和 JSON.parse() 方法實現(xiàn)了JavaScript與JSON之間相互轉換。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。