close

今天我們來看一個常見的概念 —— JSON,來看下它的概念、使用、技巧、相關工具!

一、JSON 概述1. 概念

JSON 全稱為 JavaScript Object Notation,是一種輕量級的數據交換格式。它是 JavaScript 中用於描述對象數據的語法的擴展。不過並不限於與 JavaScript 一起使用。它採用完全獨立於語言的文本格式,這些特性使 JSON 成為理想的數據交換格式。易於閱讀和編寫,同時也易於機器解析和生成。所有現代編程語言都支持這些數據結構,使 JSON 完全獨立於語言。

2. 歷史

在 2000 年代初期,Douglas Crockford 創建了 JSON 以實現最小化、可移植和文本化。作為 JavaScript 的一個子集,JSON 與 Web 瀏覽器腳本語言大約在同一時間流行起來。到 2010 年代初,JSON 成為新公共 API 的流行選擇。

JSON 於 2013 年標準化為 ECMA-404,並於 2017 年發布為 RFC8259。RFC 和 ECMA 標準保持一致。JSON 的官方媒體類型是 application/json,JSON 文件名使用擴展名 .json。

JSON 源於對無狀態、實時的服務器到瀏覽器通信協議的需求,它旨在成為 XML 的輕量級替代方案,以允許在移動處理場景和Web 上輕鬆解析 JavaScript。

JSON 通常與 REST 服務相關聯,尤其是對於 Web 上的 API。儘管 API 的 REST 架構允許使用任何格式,但 JSON 提供了一種更靈活的消息格式,可以提高通信速度。在開發需要快速、緊湊和方便的數據序列化的 Web 或移動應用程序時,它非常有用。

3. 特點

JSON 的流行正是因為網站和移動應用程序需要更快捷、有效地將數據從一個系統傳輸到另一個系統。JSON 可以通過多種方式共享數據、存儲設置以及與系統交互。它的簡單性和靈活性使其適用於許多不同的情況。

JSON 最常見的用法是通過網絡連接交換序列化數據。JSON 的其他常見用途包括公共、前端或內部 API、NoSQL 數據庫、模式描述、配置文件、公共數據或數據導出。

JSON 的特點如下:

緊湊、高效的格式:JSON 語法提供了簡單的數據解析和更快的實現;
易於閱讀:人類和計算機都可以快速解釋語法且錯誤最少;
廣泛支持:大多數語言、操作系統和瀏覽器都可以使用開箱即用的 JSON,這允許使用 JSON 而不存在兼容性問題;
自我描述:很容易區分數據類型,並且更容易解釋數據,而無需提前知道會發生什麼;
格式靈活:JSON 支持多種數據類型,可以組合起來表達大多數數據的結構。
二、JSON 結構和語法

JSON 易於編寫和閱讀,並且易於在大多數語言使用的數據結構之間進行轉換。下面來看一下 JSON 的組成、JSON 支持的數據類型。

1. 結構

下面是一個最基本的 JSON 示例:

{"name":"zhangsan"}

在上面的示例中,key是 name,value 是 zhangsan。JSON 可以保存多個 key:value對:

{"name":"zhangsan","age":18,"city":"beijing"}

當然這只是一個簡單的例子,在實際應用中 JSON 可能會多層嵌套。對象和數組是可以保存其他值的值,因此 JSON 數據可能會發生無限嵌套。這允許 JSON 描述大多數數據類型。

下面是 JSON 數據類型的完整列表:

string:用引號括起來的文字。
number:正整數或負整數或浮點數。
object:用花括號括起來的鍵值對
array:一個或多個 JSON 對象的集合。
boolean:不帶引號的 true 或 false 值。
null:表示鍵值對沒有數據,表示為null,不帶引號。

下面是一個包含這些數據類型的 JSON 對象示例:

{"name":"zhangsan","age":28,"badperson":true,"child":{"name":"zhangxiaosan","age":8},"job":["React","JavaScript"],"wages":null,}2. 語法

下面來看看如何避免常見的 JSON 語法錯誤:

始終將鍵值對保存在雙引號內,大多數 JSON 解析器使用雙引號解析 JSON 對象;
切勿在 key 中使用連字符。而是使用下劃線 (_)、全部小寫或駝峰式大小寫;
使用 JSON linter 來檢查 JSON 是有效的,可以使用 JSONLint 等工具進行校驗。
三、JSON 解析與序列化

JSON 內置了兩種方法:

JSON.parse() :將數據轉換為 JavaScript 對象。
JSON.stringify() :將 JavaScript 對象轉換為字符串。
1. JSON.parse()

JSON.parse() 的語法如下:

JSON.parse(text,reviver)
text: 必需, 一個有效的 JSON 字符串。
reviver:可選,一個轉換結果的函數, 將為對象的每個成員調用此函數。
constjson='{"name":"zhangsan","age":18,"city":"beijing"}';constmyJSON=JSON.parse(json);console.log(myJSON.name,myJSON.age);//zhangsan18

我們可以啟用 JSON.parse 的第二個參數 reviver,一個轉換結果的函數,對象的每個成員都會調用此函數:

constjson='{"name":"zhangsan","age":18,"city":"beijing"}';constmyJSON=JSON.parse(json,(key,value)=>{if(typeofvalue==="number"){returnString(value).padStart(3,"0");}returnvalue;});console.log(myJSON.name,myJSON.age);//zhangsan0182. JSON.stringify()

JSON.stringify() 的語法如下:

JSON.stringify(value,replacer,space)
value: 必需, 要轉換的 JavaScript 值(通常為對象或數組)。
replacer: 可選。用於轉換結果的函數或數組。如果 replacer 為函數,則 JSON.stringify 將調用該函數,並傳入每個成員的鍵和值。使用返回值而不是原始值。如果此函數返回 undefined,則排除成員。根對象的鍵是一個空字符串:""。如果 replacer 是一個數組,則僅轉換該數組中具有鍵值的成員。成員的轉換順序與鍵在數組中的順序一樣。當 value 參數也為數組時,將忽略 replacer 數組。
space: 可選,文本添加縮進、空格和換行符,如果 space 是一個數字,則返回值文本在每個級別縮進指定數目的空格,如果 space 大於 10,則文本縮進 10 個空格。space 也可以使用非數字,如:\t。
constjson={"name":"zhangsan","age":18,"city":"beijing"};constmyJSON=JSON.stringify(json);console.log(myJSON);//{"name":"zhangsan","age":18,"city":"beijing"}3. 異常處理

那如果 JSON 無效怎麼辦呢?比如缺少了逗號,引號等,上面的兩種方法都會拋出異常。建議在使用這兩個方法時使用try...catch來包裹,也可以將其封裝成一個函數。

letmyJSON={}constjson='{"name":"zhangsan","age":18,"city":"beijing"}';try{myJSON=JSON.parse(json);}catch(e){console.error(e.message)}console.log(myJSON.name,myJSON.age);//zhangsan18

如果 JSON 操作時出現問題,這樣就能確保應用程序不會因此中斷。

4. 其他操作① 刪除鍵值對

可以使用 delete 運算符來刪除 JSON 中的鍵值對:

constjson={"name":"zhangsan","age":18,"city":"beijing"};deletejson.city;console.log(json);//{name:'zhangsan',age:18}② 訪問數組項

可以使用方括號[]和索引從 JSON 中訪問數組項:

constjson={"name":"zhangsan","age":18,"job":["React","JavaScript"],};console.log(json.job[0]);//React③ 遍歷數組項

可以使用for循環來遍歷 JSON 中的數組項:

constjson={"name":"zhangsan","age":18,"job":["React","JavaScript"],};for(itemofjson.job){console.log(item);//ReactJavaScript}四、實用技巧

下面來看看 JSON 有哪些實用技巧。

1. 格式化

上面提到,可以使用JSON.stringify()來將 JSON 對象轉換為字符串。它支持第二、三個參數。我們可以藉助第二三個參數來格式化 JSON 字符串。正常情況下,格式化後的字符串長這樣:

constjson={"name":"zhangsan","age":18,"city":"beijing"};constmyJSON=JSON.stringify(json);console.log(myJSON);//{"name":"zhangsan","age":18,"city":"beijing"}

添加第二三個參數:

constjson={"name":"zhangsan","age":18,"city":"beijing"};constmyJSON=JSON.stringify(json,null,2);console.log(myJSON);

生成的字符串格式如下:

{"name":"zhangsan","age":18,"city":"beijing"}

這裡的 2 其實就是為返回值文本在每個級別縮進 2 個空格。

如果縮進是一個字符串而不是空格,就可以傳入需要縮進的填充字符串:

constjson={"name":"zhangsan","age":18,"city":"beijing"};constmyJSON=JSON.stringify(json,null,"--");console.log(myJSON);

輸出結果如下:

{--"name":"zhangsan",--"age":18,--"city":"beijing"}2. 隱藏屬性

我們知道JSON.stringify()支持第二個參數,用來處理 JSON 中的數據:

constuser={"name":"John","password":"12345","age":30};console.log(JSON.stringify(user,(key,value)=>{if(key==="password"){return;}returnvalue;}));//輸出結果:{"name":"John","age":30}

可以將第二個參數抽離出一個函數:

functionstripKeys(...keys){return(key,value)=>{if(keys.includes(key)){return;}returnvalue;};}constuser={"name":"John","password":"12345","age":30,"gender":"male"};console.log(JSON.stringify(user,stripKeys('password','gender')))//輸出結果:{"name":"John","age":30}3. 過濾結果

當 JSON 中的內容很多時,想要查看指定字段是比較困難的。可以藉助JSON.stringify()的第二個屬性來獲取指定值,只需傳入指定一個包含要查看的屬性 key 的數組即可:

constuser={"name":"John","password":"12345","age":30}console.log(JSON.stringify(user,['name','age']))//輸出結果:{"name":"John","age":30}五、JSON 工具

最後來推薦幾個好用的 JSON 查看器。

1. JSON Hero

JSON Hero 是一個開源的、漂亮的 JSON 查看器,它提供了包含額外功能的乾淨美觀的 UI,使閱讀和理解 JSON 文件變得容易。

以任何方式查看 JSON:列視圖、樹視圖、編輯器視圖等;
自動推斷字符串的內容並提供有用的預覽;
創建可用於驗證 JSON 的推斷 JSON 模式;
快速掃描相關值以檢查邊緣情況;
搜索您的 JSON 文件(鍵和值);
可使用鍵盤;
具有路徑支持的可輕鬆共享的 URL。

Github:https://github.com/jsonhero-io/jsonhero-web

2. JSON Visio

JSON Visio 是一個 JSON 數據的可視化工具,它可以無縫地在圖表上展示數據,而無需重組任何內容、直接粘貼或導入文件。

Github:https://github.com/AykutSarac/jsonvisio.com

3. JSON Viewer Pro

JSON Viewer Pro 是一個Chrome擴展程序,主要用於可視化JSON文件。其核心功能包括:

支持將JSON數據進行格式化,並使用屬性或者圖表進行展示;
使用麵包屑深入遍歷 JSON 屬性;
在輸入區寫入自定義 JSON;
導入本地 JSON 文件;
使用上下文菜單下載 JSON 文件;
網址過濾器;
改變主題;
自定義 CSS ;
複製屬性和值;

輸入界面如下:

格式化之後:

4. 其他工具
JSONLint[1]:JSON 數據的驗證器;
JSONedit[2]:一個可視化 JSON 構建器,可以輕鬆構建具有不同數據類型的複雜 JSON 結構;
JSON API[3]:用於在 JSON 中構建 API 的規範;
JSON Formatter[4]:用於驗證、美化、縮小和轉換 JSON 數據的在線工具;
JSON Generator[5]:生成隨機 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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()