在C++環境中使用JsonCpp讀寫Json數據
阿新 • • 發佈:2017-10-12
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數據