一:下載Jsoncpp庫
https://sourceforge.net/projects/jsoncpp/
下載源碼解壓之后得到jsoncpp-src-0.5.0文件夾:
我們只需要jsoncpp的頭文件和cpp文件。
其中jsonscpp的頭文件位於jsoncpp-src-0.5.0\include\json:
jsoncpp的cpp文件位於jsoncpp-src-0.5.0\src\lib_json:
將頭文件目錄和源文件目錄拷貝到項目根目錄下(都位於根目錄):
其中json頭文件目錄不能修改名稱,因為后面源文件引用格式<json/...>,lib_json源文件可以修改(也可以不用修改)
項目編譯命令:
g++ readJsonStr.cpp ./lib_json/*.cpp -I ./ -o main
其中readJsonStr.cpp與./lib_json/*.cpp都是需要編譯的文件,然后使用-I指定頭文件所在的根目錄位置,-o輸出執行文件
二:從字符串中讀取Json數據
#include <string> #include <json/json.h> #include <iostream> #include <fstream> #include <typeinfo> //判斷類型 #include <vector> using namespace std; void readStrJson(); //從字符串中讀取Json數據(簡單Json格式) void readStrProJson(); //同樣從字符串中讀取Json數據(Json格式更加復雜) int main(int argc,char* argv) { cout<<"sample case:"<<endl; readStrJson(); cout<<"complex case:"<<endl; readStrProJson(); return 0; }
(一)基礎數據類型讀取
void readStrJson() { //字符串 ----- 注意:使用""作為換行也可以,實際寫成一行也可以"{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\",\"born\":-100,\"died\":-44}"; const char* str = "{\"praenomen\":\"Gaius\"," "\"nomen\":\"Julius\",\"cognomen\":\"Caezar\"," "\"born\":-100,\"died\":-44}"; /* //json內容如下: key:val其中val為字符串、數字等基礎類型 { "praenomen":"Gaius", "nomen":"Julius", "cognomen":"Caezar", "born":-100, "died":-44 } */ Json::Reader reader; //用於讀取字符串 Json::Value root; //用於存放結果到map中 if(reader.parse(str,root)) { string praenomen = root["praenomen"].asString(); string nomen = root["nomen"].asString(); string cognomen = root["cognomen"].asString(); int born = root["born"].asInt(); int died = root["died"].asInt(); //cout<<root["born"]<<typeid(root["born"]).name()<<endl; //封裝為了一個對象N4Json5ValueE cout<<praenomen+" "+nomen+" "+cognomen<<" was born in year "<< born <<", died in year "<<died<<endl; } }
(二)復合數據類型讀取
void readStrProJson() { string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}"; /* //json內容如下: { "name": "json″, "array": [ { "cpp": "jsoncpp" }, { "java": "jsoninjava" }, { "php": "support" } ] } */ Json::Reader reader; Json::Value root; if(reader.parse(strValue,root)) { string name = root["name"].asString(); cout<<name<<endl; const Json::Value arrayObj = root["array"]; //cout<<typeid(arrayObj).name()<<endl; //N4Json5ValueE for(unsigned int i=0;i<arrayObj.size();i++){ if(arrayObj[i].isMember("cpp")) //是查找內部是否有這個key cout<<"key is Cpp"<<endl; //cout<<typeid(arrayObj[i]).name()<<endl; //N4Json5ValueE vector<string> mems = arrayObj[i].getMemberNames(); //獲取所有keys for(unsigned int j=0;j<mems.size();j++){ cout<<mems[j]<<":"<<arrayObj[i][string(mems[j])]; } } } }
三:從Json文件中讀取數據
#include <string> #include <json/json.h> #include <iostream> #include <fstream> #include <vector> using namespace std; void readFileJson(); //從文件中讀取Json int main(int argc,char* argv[]) { readFileJson(); return 0; } /* 文件內容: { "name":"Mike Jiang", "age":23, "sex_is_male":true, "partner": { "partner_name":"Galatea", "partner_age":21, "partner_sex_is_male":false }, "achievement":["ach1","ach2","ach3"] } */ void readFileJson() { Json::Reader reader; Json::Value root; ifstream in("test.json",ios::binary); if(!in.is_open()){ cout<<"Error opening"<<endl; return; } if(reader.parse(in,root)){ string name = root["name"].asString(); int age = root["age"].asInt(); bool sexIsM = root["sex_is_male"].asBool(); cout<<"My name is "<<name<<endl; cout<<"I`m "<<age<<endl; cout<<"I`m a"<<(sexIsM?"man":"woman")<<endl; //讀取子節點--字典 const Json::Value partner = root["partner"]; vector<string> keys = partner.getMemberNames(); for(unsigned int i=0;i<keys.size();i++){ cout<<partner[keys[i]]; } //讀取子節點--列表 const Json::Value achievement = root["achievement"]; for(unsigned int i=0;i<achievement.size();i++){ cout<<achievement[i].asString()<<endl; } } in.close(); }
四:寫入Json數據到文件中
#include <string> #include <json/json.h> #include <iostream> #include <fstream> #include <vector> using namespace std; /* //json文件內容如下: { "achievement" : [ "ach1", "ach2", "ach3" ], "age" : 23, "name" : "Mike Jiang", "partner" : { "partner_age" : 21, "partner_name" : "Galatea", "partner_sex_is_male" : false }, "sex_is_male" : true } */ void writeFileJson();//將信息保存為JSON格式 int main(int argc,char* argv[]) { writeFileJson(); return 0; } void writeFileJson() { //根節點 Json::Value root; root["name"] = Json::Value("Mike Jiang"); root["age"] = Json::Value(23); root["sex_is_male"] = Json::Value(false); //子節點 Json::Value partner; partner["partner_name"] = Json::Value("Galatea"); partner["partner_age"] = Json::Value(21); partner["partner_sex_is_male"] = Json::Value(false); //子節點掛到父節點 root["partner"] = Json::Value(partner); //數組形式 root["achievement"].append("ach1"); root["achievement"].append("ach2"); root["achievement"].append("ach3"); //兩種輸出形式---這里直接輸出 //1.直接輸出 cout<<"Fast Writer:"<<endl; Json::FastWriter fw; cout<<fw.write(root)<<endl; //2.縮進輸出 cout<<"Styled Writer:"<<endl; Json::StyledWriter sw; cout<<sw.write(root)<<endl; //----開始輸出到文件(將使用縮進格式) ofstream os; os.open("demo2.json"); os<<sw.write(root); os.close(); }