C++ jsoncpp編譯及連結庫的使用
阿新 • • 發佈:2019-02-05
1. Jsoncpp介紹
(1)JsonCpp主要包含三種類型的class:Value Reader Writer;
Json::Value 是jsoncpp 中最基本、最重要的類,用於表示各種型別的物件,jsoncpp 支援的物件型別可見 Json::ValueType 列舉值。
Json::Reader 是用於讀取的,說的確切點,是用於將字串轉換為 Json::Value 物件的。
Json::Writer 類是一個純虛類,並不能直接使用。在此我們使用 Json::Writer 的子類:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。
(2)Jsoncpp中所有物件、類名都在namespace json中,包含json.h即可
2. Jsoncpp的下載與編譯
下載下來的jsoncpp必須要編譯才能使用,在ubuntut上使用如下:
apt-get install scons
####下載jsoncpp-src-0.5.0.tar.gz######
tar -xvzf jsoncpp-src-0.5.0.tar.gz
cd jsoncpp-src-0.5.0
scons platform=linux-gcc
gcc版本是4.6的,上面的命令執行完後,會在jsoncpp-src-0.5.0/libs/linux-gcc-4.6目錄下面生成庫檔案:
(1)libjson_linux-gcc-4.6_libmt.a
(2)libjson_linux-gcc-4.6_libmt.so
之後,將動態連結庫libjson_linux-gcc-4.6_libmt.so,新增到搜尋路徑中,
參照:linux找不到動態連結庫 .so檔案的解決方法 http://www.cnblogs.com/xudong-bupt/p/3698294.html
3.Jsoncpp使用程式碼示例
3.1 程式解析json資料
解析下面的檔案JsonText,檔案如下:
{
"name": "json",
"array": [
"123",
"456",
"789"
]
}
程式碼(c.cpp):
#include "json/json.h"
#include <string>
#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream is;
is.open ("JsonText", std::ios::binary );
Json::Reader reader;
Json::Value root;
if(reader.parse(is,root)) ///root儲存整個Json物件的value
{
if(!root["name"].isNull())
{
cout<<root["name"].asString()<<endl; ///讀取元素
Json::Value arrayObj = root["array"];
for(int i=0 ; i< arrayObj.size() ;i++)
{
cout<<arrayObj[i].asString()<<endl;
}
}
}
return 0;
}
編譯、連結、執行:
g++ c.cpp -I ./include/ -L./libs/linux-gcc-4.6/ -ljson_linux-gcc-4.6_libmt -o C
./C
執行結果:
json
123
456
789
3.2 程式生成json資料
程式碼:
#include <iostream>
#include <string>
#include "json/json.h"
int main(void)
{
Json::Value root;
Json::Value arrayObj;
Json::Value item;
for (int i = 0; i < 2; i ++)
{
item["key"] = i;
//arrayObj.append(item); ///給arrayObj中新增元素(arrayObj變為陣列)
arrayObj.append(i); ///給arrayObj中新增元素(arrayObj變為陣列)
}
root["key1"] = "value1"; ///給root中新增屬性(arrayObj變為map)
root["key2"] = "value2";
root["array"] = arrayObj;
//root.toStyledString();
std::string out = root.toStyledString(); ///轉換為json格式字串
std::cout << out << std::endl;
return 0;
}
編譯、連結、執行:
g++ b.cpp -I ./include/ -L./libs/linux-gcc-4.6/ -ljson_linux-gcc-4.6_libmt -o B
./B
執行結果:
{
"array" : [ 0, 1 ],
"key1" : "value1",
"key2" : "value2"
}
#include <string>
#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream is;
is.open ("JsonText", std::ios::binary );
Json::Reader reader;
Json::Value root;
if(reader.parse(is,root)) ///root儲存整個Json物件的value
{
if(!root["name"].isNull())
{
cout<<root["name"].asString()<<endl; ///讀取元素
Json::Value arrayObj = root["array"];
for(int i=0 ; i< arrayObj.size() ;i++)
{
cout<<arrayObj[i].asString()<<endl;
}
}
}
return 0;
}