初探JsonCpp - 編譯與基本使用

li27z發表於2017-07-01

JSON(JavaScript Object Notation,JS 物件標記) 是一種輕量級的資料交換格式。它基於 ECMAScript (w3c制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。易於人閱讀和編寫,同時也易於機器解析和生成,有效地提升了網路傳輸效率。

本文主要介紹 JSON 第三方解析庫 JsonCpp 的安裝編譯過程以及基本使用。

編譯

https://sourceforge.net/projects/jsoncpp/ 我們可以獲取到 JsonCpp 庫。

CentOS上 的編譯過程如下:

1)解壓縮。
這裡寫圖片描述

2)在編譯生成動態和靜態庫之前,我們需要安裝 linux 下的自動構建工具 scons,步驟如下圖。
這裡寫圖片描述

解壓縮,然後進入目錄 scons-2.2.0。
這裡寫圖片描述

這裡寫圖片描述

3)利用自動構建工具 scons 生成所需的 libjson,操作如圖。
這裡寫圖片描述

執行完畢,會在目錄 jsoncpp-src-0.5.0/libs/linux-gcc-4.4.7 下生成庫檔案:
這裡寫圖片描述

然後,將動態連結庫 libjson_linux-gcc-4.4.7_libmt.so 新增到搜尋路徑中。

至此,編譯就完成了,接下來我們來看看 JsonCpp 的基本使用。

基本使用

(1)JsonCpp簡介
JsonCpp 主要包含三種型別的class:ValueReaderWriter
①Json::Value 是 JsonCpp 中最基本、最重要的類,用於表示各種型別的物件,JsonCpp 支援的物件型別可見 Json::ValueType 列舉值。

②Json::Reader 是用於讀取的,說的確切點,是用於將字串轉換為 Json::Value 物件的。

③Json::Writer 類是一個純虛類,並不能直接使用。我們一般使用 Json::Writer 的子類:Json::FastWriter、Json::StyledWriter 和 Json::StyledStreamWriter。

(2)使用示例
1)示例1:從字串中讀取JSON
程式碼如下:

#include "json/json.h"
#include <iostream>

using namespace std;

int main()
{
    const char* strValue = "{\"name\":\"json\",\"gender\":\"male\",\"height\":175,\"weight\":65}";

    Json::Reader reader;
    Json::Value value;

    if(reader.parse(strValue, value))
    {
        string name = value["name"].asString();
        string gender = value["gender"].asString();
        int height = value["height"].asInt();
        int weight = value["weight"].asInt();

        cout << "name: " << name << endl;
        cout << "gender:" << gender << " height:" << height << "cm weight:" << weight << "kg" << endl;
    }
    return 0;
}

執行結果:
這裡寫圖片描述

2)示例2:從檔案中讀取JSON
待解析的檔案內容如下:

{
    "name": "json",
    "array": [
        "123",
        "456",
        "789"
     ]
}

程式碼如下:

#include "json/json.h"
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream is;
    is.open("JsonText", ios::binary);

    Json::Reader reader;
    Json::Value value;

    if(reader.parse(is, value))
    {
        if(!value["name"].isNull())
        {
            cout << value["name"].asString() << endl;
            Json::Value arrayObj = value["array"];
            for(int i = 0; i < arrayObj.size(); i++)
            {
                cout << arrayObj[i].asString() << endl;
            }
        }
    }
    return 0;
}

執行結果:
這裡寫圖片描述

3)示例3:程式生成JSON資料
程式碼如下:

#include "json/json.h"
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    Json::Value value;
    Json::Value arrayObj;

    for(int i = 0; i < 2; i++)
    {
        arrayObj.append(i);
    }

    value["key1"] = "value1";
    value["key2"] = "value2";
    value["array"] = arrayObj;

    // 直接輸出
    cout << "FastWriter:" << endl;
    Json::FastWriter fw;
    cout << fw.write(value) << endl;

    // 縮排輸出
    cout << "StyledWriter:" << endl;
    Json::StyledWriter sw;
    cout << sw.write(value) << endl;

    // 輸出到檔案
    ofstream os;
    os.open("JsonTest");
    os << sw.write(value);
    os.close();

    return 0;
}

執行結果:
這裡寫圖片描述

這裡寫圖片描述


參考資料:
1.【C++】JSON檔案的讀取和生成. https://my.oschina.net/Tsybius2014/blog/289527
2.C++ Jsoncpp原始碼編譯與解析Json. http://www.cnblogs.com/xudong-bupt/p/3696329.html

相關文章