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