掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
今天我們來看一個(gè)常見的概念 —— JSON,來看下它的概念、使用、技巧、相關(guān)工具!

JSON 全稱為 JavaScript Object Notation,是一種輕量級(jí)的數(shù)據(jù)交換格式。它是 JavaScript 中用于描述對(duì)象數(shù)據(jù)的語法的擴(kuò)展。不過并不限于與 JavaScript 一起使用。它采用完全獨(dú)立于語言的文本格式,這些特性使 JSON 成為理想的數(shù)據(jù)交換格式。易于閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。所有現(xiàn)代編程語言都支持這些數(shù)據(jù)結(jié)構(gòu),使 JSON 完全獨(dú)立于語言。
在 2000 年代初期,Douglas Crockford 創(chuàng)建了 JSON 以實(shí)現(xiàn)最小化、可移植和文本化。作為 JavaScript 的一個(gè)子集,JSON 與 Web 瀏覽器腳本語言大約在同一時(shí)間流行起來。到 2010 年代初,JSON 成為新公共 API 的流行選擇。
JSON 于 2013 年標(biāo)準(zhǔn)化為 ECMA-404,并于 2017 年發(fā)布為 RFC8259。RFC 和 ECMA 標(biāo)準(zhǔn)保持一致。JSON 的官方媒體類型是 application/json,JSON 文件名使用擴(kuò)展名 .json。
JSON 源于對(duì)無狀態(tài)、實(shí)時(shí)的服務(wù)器到瀏覽器通信協(xié)議的需求,它旨在成為 XML 的輕量級(jí)替代方案,以允許在移動(dòng)處理場景和Web 上輕松解析 JavaScript。
JSON 通常與 REST 服務(wù)相關(guān)聯(lián),尤其是對(duì)于 Web 上的 API。盡管 API 的 REST 架構(gòu)允許使用任何格式,但 JSON 提供了一種更靈活的消息格式,可以提高通信速度。在開發(fā)需要快速、緊湊和方便的數(shù)據(jù)序列化的 Web 或移動(dòng)應(yīng)用程序時(shí),它非常有用。
JSON 的流行正是因?yàn)榫W(wǎng)站和移動(dòng)應(yīng)用程序需要更快捷、有效地將數(shù)據(jù)從一個(gè)系統(tǒng)傳輸?shù)搅硪粋€(gè)系統(tǒng)。JSON 可以通過多種方式共享數(shù)據(jù)、存儲(chǔ)設(shè)置以及與系統(tǒng)交互。它的簡單性和靈活性使其適用于許多不同的情況。
JSON 最常見的用法是通過網(wǎng)絡(luò)連接交換序列化數(shù)據(jù)。JSON 的其他常見用途包括公共、前端或內(nèi)部 API、NoSQL 數(shù)據(jù)庫、模式描述、配置文件、公共數(shù)據(jù)或數(shù)據(jù)導(dǎo)出。
JSON 的特點(diǎn)如下:
JSON 易于編寫和閱讀,并且易于在大多數(shù)語言使用的數(shù)據(jù)結(jié)構(gòu)之間進(jìn)行轉(zhuǎn)換。下面來看一下 JSON 的組成、JSON 支持的數(shù)據(jù)類型。
下面是一個(gè)最基本的 JSON 示例:
{"name": "zhangsan"}
在上面的示例中,key是 name,value 是 zhangsan。JSON 可以保存多個(gè) key:value對(duì):
{"name": "zhangsan", "age": 18, "city": "beijing"}
當(dāng)然這只是一個(gè)簡單的例子,在實(shí)際應(yīng)用中 JSON 可能會(huì)多層嵌套。對(duì)象和數(shù)組是可以保存其他值的值,因此 JSON 數(shù)據(jù)可能會(huì)發(fā)生無限嵌套。這允許 JSON 描述大多數(shù)數(shù)據(jù)類型。
下面是 JSON 數(shù)據(jù)類型的完整列表:
下面是一個(gè)包含這些數(shù)據(jù)類型的 JSON 對(duì)象示例:
{
"name": "zhangsan",
"age": 28,
"badperson":true,
"child": {
"name": "zhangxiaosan",
"age": 8
},
"job": ["React", "JavaScript"],
"wages": null,
}
下面來看看如何避免常見的 JSON 語法錯(cuò)誤:
JSON 內(nèi)置了兩種方法:
JSON.parse() 的語法如下:
JSON.parse(text, reviver)
const json = '{"name": "zhangsan", "age": 18, "city": "beijing"}';
const myJSON = JSON.parse(json);
console.log(myJSON.name, myJSON.age); // zhangsan 18
我們可以啟用 JSON.parse 的第二個(gè)參數(shù) reviver,一個(gè)轉(zhuǎn)換結(jié)果的函數(shù),對(duì)象的每個(gè)成員都會(huì)調(diào)用此函數(shù):
const json = '{"name": "zhangsan", "age": 18, "city": "beijing"}';
const myJSON = JSON.parse(json, (key, value) => {
if(typeof value === "number") {
return String(value).padStart(3, "0");
}
return value;
});
console.log(myJSON.name, myJSON.age); // zhangsan 018
JSON.stringify() 的語法如下:
JSON.stringify(value, replacer, space)
const json = {"name": "zhangsan", "age": 18, "city": "beijing"};
const myJSON = JSON.stringify(json);
console.log(myJSON); // {"name":"zhangsan","age":18,"city":"beijing"}
那如果 JSON 無效怎么辦呢?比如缺少了逗號(hào),引號(hào)等,上面的兩種方法都會(huì)拋出異常。建議在使用這兩個(gè)方法時(shí)使用try...catch來包裹,也可以將其封裝成一個(gè)函數(shù)。
let myJSON = {}
const json = '{"name": "zhangsan", "age": 18, "city": "beijing"}';
try {
myJSON = JSON.parse(json);
} catch (e){
console.error(e.message)
}
console.log(myJSON.name, myJSON.age); // zhangsan 18
如果 JSON 操作時(shí)出現(xiàn)問題,這樣就能確保應(yīng)用程序不會(huì)因此中斷。
① 刪除鍵值對(duì)
可以使用 delete 運(yùn)算符來刪除 JSON 中的鍵值對(duì):
const json = {"name": "zhangsan", "age": 18, "city": "beijing"};
delete json.city;
console.log(json); // {name: 'zhangsan', age: 18}
② 訪問數(shù)組項(xiàng)
可以使用方括號(hào)[]和索引從 JSON 中訪問數(shù)組項(xiàng):
const json = {
"name": "zhangsan",
"age": 18,
"job": ["React", "JavaScript"],
};
console.log(json.job[0]); // React
③ 遍歷數(shù)組項(xiàng)
可以使用for循環(huán)來遍歷 JSON 中的數(shù)組項(xiàng):
const json = {
"name": "zhangsan",
"age": 18,
"job": ["React", "JavaScript"],
};
for (item of json.job) {
console.log(item); // React JavaScript
}
下面來看看 JSON 有哪些實(shí)用技巧。
上面提到,可以使用JSON.stringify()來將 JSON 對(duì)象轉(zhuǎn)換為字符串。它支持第二、三個(gè)參數(shù)。我們可以借助第二三個(gè)參數(shù)來格式化 JSON 字符串。正常情況下,格式化后的字符串長這樣:
const json = {"name": "zhangsan", "age": 18, "city": "beijing"};
const myJSON = JSON.stringify(json);
console.log(myJSON); // {"name":"zhangsan","age":18,"city":"beijing"}
添加第二三個(gè)參數(shù):
const json = {"name": "zhangsan", "age": 18, "city": "beijing"};
const myJSON = JSON.stringify(json, null, 2);
console.log(myJSON);
生成的字符串格式如下:
{
"name": "zhangsan",
"age": 18,
"city": "beijing"
}
這里的 2 其實(shí)就是為返回值文本在每個(gè)級(jí)別縮進(jìn) 2 個(gè)空格。
如果縮進(jìn)是一個(gè)字符串而不是空格,就可以傳入需要縮進(jìn)的填充字符串:
const json = {"name": "zhangsan", "age": 18, "city": "beijing"};
const myJSON = JSON.stringify(json, null, "--");
輸出結(jié)果如下:
{
--"name": "zhangsan",
--"age": 18,
--"city": "beijing"
}
我們知道JSON.stringify()支持第二個(gè)參數(shù),用來處理 JSON 中的數(shù)據(jù):
const user = {
"name": "John",
"password": "12345",
"age": 30
};
console.log(JSON.stringify(user, (key, value) => {
if (key === "password") {
return;
}
return value;
}));
// 輸出結(jié)果:{"name":"John","age":30}
可以將第二個(gè)參數(shù)抽離出一個(gè)函數(shù):
function stripKeys(...keys) {
return (key, value) => {
if (keys.includes(key)) {
return;
}
return value;
};
}
const user = {
"name": "John",
"password": "12345",
"age": 30,
"gender": "male"
};
console.log(JSON.stringify(user, stripKeys('password', 'gender')))
// 輸出結(jié)果:{"name":"John","age":30}
當(dāng) JSON 中的內(nèi)容很多時(shí),想要查看指定字段是比較困難的??梢越柚鶭SON.stringify()的第二個(gè)屬性來獲取指定值,只需傳入指定一個(gè)包含要查看的屬性 key 的數(shù)組即可:
const user = {
"name": "John",
"password": "12345",
"age": 30
}
console.log(JSON.stringify(user, ['name', 'age']))
// 輸出結(jié)果:{"name":"John","age":30}
最后來推薦幾個(gè)好用的 JSON 查看器。
JSON Hero 是一個(gè)開源的、漂亮的 JSON 查看器,它提供了包含額外功能的干凈美觀的 UI,使閱讀和理解 JSON 文件變得容易。
Github:https://github.com/jsonhero-io/jsonhero-web
JSON Visio 是一個(gè) JSON 數(shù)據(jù)的可視化工具,它可以無縫地在圖表上展示數(shù)據(jù),而無需重組任何內(nèi)容、直接粘貼或?qū)胛募?/p>
Github:https://github.com/AykutSarac/jsonvisio.com
JSON Viewer Pro 是一個(gè)Chrome擴(kuò)展程序,主要用于可視化JSON文件。其核心功能包括:
輸入界面如下:
格式化之后:
[1] JSONLint: https://jsonlint.com/。
[2] JSONedit: https://mb21.github.io/JSONedit/。
[3] JSON API: https://jsonapi.org/。
[4] JSON Formatter: https://jsonformatter.org/。
[5] JSON Generator: https://extendsclass.com/json-generator.html。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流