工作過程中,經常需要使用json這種輕量級的數據交換格式,例如,通過它可以組織數據保存到配置文件,客戶端和服務端通過json格式來進行通信等,但是,針對特定的需求場景,需要設計怎樣的json格式比較合適呢,json到底可以支持多少種格式呢,有沒有一種簡單的概括,就能讓使用者輕鬆使用它呢!
一般知識都有基本的理論結構,所以,本文首先將說明json的基本知識點,然後基於開源軟體jsoncpp來說明如何構建/讀寫json, 再分享個人的使用心得,最後再總結json的關鍵要點,理解了這一點,玩轉json不是問題。
一、Json簡介
Json是輕量級的數據交換格式,它便於閱讀和編寫,它是完全獨立於程序語言的文本格式。
二、Json結構
Json有兩個結構, 分別是「名稱/值」對的集合和值的有序列表。「名稱/值」對的集合可以簡單理解為對象集合,而值的有序列表可以理解為數組。

這裡舉一個「名稱/值」對的集合的例子,它是以左大括弧開始,以右大括弧結束,中間是由多個「名稱/值」對組成,各個「名稱/值」對之間用逗號隔開。

舉一個「值的有序列表」的例子,它是以左中括弧開始,以右中括弧結束,中間是由多個值組成,各個值之間用逗號隔開。

三、Json形式
Json主要由三種形式,分別為對象(object), 數組(array), 值(value)。
對象(object)是「名稱/值」對集合,名稱與值之間通過冒號隔開,另外對象是以左大括弧開始,以右大括弧結束。

數組(array)是值的有序集合,它是以左中括弧開始,以右中括弧結束。

值(value)可以是字元串(string)、數值(number)、對象(object)、數組(array)、true、false、null。這裡我們會發現對象(object)裡面有值(value), 數組(array)裡面也有值(value), 而值(value)又包含有對象和數組,所以它們是可以嵌套的。

Json就是由上面簡單的元素來組建複雜的信息元素。
四、Json例子
jsoncpp是C++語言編寫的開源json庫,通過該庫,我們可以很容易的構建、讀寫json。接下來就基於jsoncpp來實現幾個構建、讀取json的例子。通過例子可以對json有更深的理解。jsoncpp最基本的對象就是Json::Value。
構建一個最簡單的對象,然後輸出整個json信息,最後讀取json值,先調用isMember判斷名稱是否為root成員,如果是的話,那麼就讀取輸出。

輸出的日誌信息如下所示,大括弧包含了一個「名稱/值」對。

構建嵌套對象,第一個「名稱/值」對中的「值」又是一個對象。

輸出的日誌信息如下所示

構建三層嵌套對象,第一個「名稱/值」對中的「值」是一個對象,而該對象的「值」又是一個對象。依次類推,可以構建更多層的嵌套對象。

輸出的日誌信息如下所示

構建簡單的數組,jsoncpp中構建數組是通過append的介面來創建的。讀取數組之前,先調用isArray來判斷對象是否為數組,如果是的話,再讀取輸出。這裡需要注意數組的個數。從防禦式編程的角度看,讀取數組值之前,需要判斷數組索引是否在有效範圍內。

輸出的日誌信息如下所示,從這裡我們也可以確定數組是可以單獨作為獨立json串出現的。之前一直都有一個誤區,就是認為json一定要用大括弧包括起來。

構建對象和數組組成的json。首先創建一個數組,然後將其作為對象的值

輸出的日誌信息如下所示

最後再構建稍微複雜一點的json串,它是由對象、數組、對象來組成的,即對象的值是一個數組,而數組內部的值是由對象組成。

輸出的日誌信息如下所示

五、使用心得
- 讀取json值之前,先判斷其有效性,可以結合斷言機制,調用isMember或者isArray來進行判斷。
- 使用數組的時候,需要特別注意數組下標。
六、總結
json主要是由對象或數組創建而成,而它們的嵌套使用就可以創建複雜的json串,根據特定場景的需求來創建適用的json格式。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/268743.html
微信掃一掃
支付寶掃一掃