1. 程式人生 > >在C++環境中使用JsonCpp讀寫Json數據

在C++環境中使用JsonCpp讀寫Json數據

mstr 鍵值對 方案 執行命令 target clas rom 清除 抽象類

JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式。通常用於數據交換或存儲。

JsonCpp是一個基於C++語言的開源庫,用於C++程序的Json數據的讀寫操作。

JsonCpp是一個開源庫

下載地址:https://github.com/open-source-parsers/jsoncpp

文檔地址:http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html

使用

官方提供的集成方案:https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated

其中最簡單的方法是執行項目根目錄中的python腳本,構建頭文件和源文件。

1. 在安裝Python環境的控制臺中進入jsoncpp項目根目錄,

2. 執行命令:

python amalgamate.py

3. 將生成的dist目錄拷貝到自己的項目中,其中包源文件jsoncpp.cpp和頭文件json.h、json-forwards.h

基本類和方法

使用jsoncpp庫時需要包含頭文件#include <json/json.h>(包含目錄根據需要修改)

方法命名空間:Json

常用類

Value:用於存儲Json數據

CharReader:從字符串中讀取Json數據的抽象類

CharReaderBuilder:CharReader類的實現,可以讀取標準輸入流中的數據

Demo

定義Json數據結構,並輸出數據

Json::Value jsonRoot; //定義根節點
Json::Value jsonItem; //定義一個子對象
jsonItem["item1"] = "one"; //添加數據
jsonItem["item2"] = 2;
jsonRoot.append(jsonItem); 
jsonItem.clear(); //清除jsonItem
jsonItem["item1.0"] = 1.0; jsonItem["item2.0"] = 2.0; jsonRoot
["item"] = jsonItem; cout << jsonRoot.toStyledString() << endl; //輸出到控制臺

將Json寫入到文件

ofstream ofs; //標準輸出流
ofs.open("sample.json"); //創建文件
ofs << jsonRoot.toStyledString(); //輸出
ofs.close();

從文件讀取Json數據

ifstream ifs; //標準輸入流
ifs.open("sample.json");
jsonRoot.clear();
Json::CharReaderBuilder builder; builder[
"collectComments"] = false; JSONCPP_STRING errs; if (!parseFromStream(builder, ifs, &jsonRoot, &errs)) //從ifs中讀取數據到jsonRoot { return; }

從字符串讀取Json數據

string jsonStr = jsonRoot.toStyledString(); //json字符串
jsonRoot.clear();
Json::CharReaderBuilder builder; builder[
"collectComments"] = false; JSONCPP_STRING errs; Json::CharReader* reader = builder.newCharReader(); if (!reader->parse(jsonStr.data(), jsonStr.data() + jsonStr.size(), &jsonRoot, &errs)) //從jsonStr中讀取數據到jsonRoot { return; }

獲取Json中的鍵值對

for (auto i = 0; i < jsonRoot.size(); i++)
{
    for (auto sub= jsonRoot[i].begin(); sub != jsonRoot[i].end(); sub++)
    {
        cout << sub.name() << " : " << jsonRoot[i][sub.name()] << endl;
    }
}

在C++環境中使用JsonCpp讀寫Json數據