C++ 解析Json
C++ 解析Json——jsoncpp JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,和xml類似,本文主要對VS2008中使用Jsoncpp解析json的方法做一下記錄。
Jsoncpp是個跨平臺的開源庫,下載地址:http://sourceforge.net/projects/jsoncpp/,我下載的是v0.5.0,壓縮包大約104K。
方法一:使用Jsoncpp生成的lib文件
? ????解壓上面下載的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目錄里找到j(luò)soncpp.sln,用VS2008版本編譯,默認生成靜態(tài)鏈接庫。 在工程中引用,只需要包含include/json下的頭文件及生成的.lib文件即可。
? ????如何包含lib文件:在.cpp文件中#pragma comment(lib.“json_vc71_libmt.lib”),在工程屬性中Linker下Input中Additional Dependencies寫入lib文件名字(Release下為json_vc71_libmt.lib,Debug為json_vc71_libmtd.lib)
注意:Jsoncpp的lib工程編譯選項要和VS工程中的編譯選項保持一致。如lib文件工程編譯選項為MT(或MTd),VS工程中也要選擇MT(或MTd),否則會出現(xiàn)編譯錯誤問題,debug和release下生成的lib文件名字不同,注意不要看錯了,當成一個文件來使用(我就犯了這個錯誤)。
方法二:使用Jsoncpp包中的.cpp和.h文件
? ????解壓上面下載的Jsoncpp文件,把jsoncpp-src-0.5.0文件拷貝到工程目錄下,將jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json和jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目錄里的文件包含到VS工程中,在VS工程的屬性C/C++下General中Additional Include Directories包含頭文件目錄.\jsoncpp-src-0.5.0\include。在使用的cpp文件中包含json頭文件即可,如:#include “json/json.h”。將json_reader.cpp、json_value.cpp和json_writer.cpp三個文件的Precompiled Header屬性設(shè)置為Not Using Precompiled Headers,否則編譯會出現(xiàn)錯誤。
jsoncpp 使用詳解jsoncpp 主要包含三種類型的 class:Value、Reader、Writer。jsoncpp 中所有對象、類名都在 namespace Json 中,包含 json.h 即可。Json::Value 只能處理 ANSI 類型的字符串,如果 C++ 程序是用 Unicode 編碼的,最好加一個 Adapt 類來適配。
下面是從網(wǎng)上找的代碼示例:
? ??const?char*?str?=?“{“uploadid”:?“UP000000”,“code”:?100,“msg”:?“”,“files”:?“”}”;
Json::Reader?reader;??
????Json::Value?root;??
????if?(reader.parse(str,?root))??//?reader將Json字符串解析到root,root將包含Json里所有子元素??
????{??
????????std::string?upload_id?=?root[“uploadid”].asString();??//?訪問節(jié)點,upload_id?=?“UP000000”??
????????int?code?=?root[“code”].asInt();????//?訪問節(jié)點,code?=?100?
????} ?2. 從文件解析json
int?ReadJsonFromFile(const?char*?filename)??
{??
????Json::Reader?reader;//?解析json用Json::Reader???
????Json::Value?root;?//?Json::Value是一種很重要的類型,可以代表任意類型。如int,?string,?object,?array
std::ifstream?is;??
????is.open?(filename,?std::ios::binary?);????
????if?(reader.parse(is,?root,?FALSE))??
????{??
????????std::string?code;??
????????if?(!root[“files”].isNull())??//?訪問節(jié)點,Access?an?object?value?by?name,?create?a?null?member?if?it?does?not?exist.??
????????????code?=?root[“uploadid”].asString();??
????????
????????code?=?root.get(“uploadid”,?“null”).asString();//?訪問節(jié)點,Return?the?member?named?key?if?it?exist,?defaultValue?otherwise.
int?file_size?=?root[“files”].size();??//?得到"files"的數(shù)組個數(shù)??
????????for(int?i?=?0;?i?<?file_size;?++i)??//?遍歷數(shù)組??
????????{??
????????????Json::Value?val_image?=?root[“files”][i][“images”];??
????????????int?image_size?=?val_image.size();??
????????????for(int?j?=?0;?j?<?image_size;?++j)??
????????????{??
????????????????std::string?type?=?val_image[j][“type”].asString();??
????????????????std::string?url??=?val_image[j][“url”].asString();?
????????????????printf(“type?:?%s,?url?:?%s?\n”,?type.c_str(),?url.c_str());
????????????}??
????????}??
????}??
????is.close();
return?0;??
}?3. 向文件中插入json
void?WriteJsonData(const?char*?filename)
{
????Json::Reader?reader;??
????Json::Value?root;?//?Json::Value是一種很重要的類型,可以代表任意類型。如int,?string,?object,?array
std::ifstream?is;??
????is.open?(filename,?std::ios::binary?);????
????if?(reader.parse(is,?root))??
????{??
????????Json::Value?arrayObj;???//?構(gòu)建對象??
????????Json::Value?new_item,?new_item1;??
????????new_item[“date”]?=?“2011-11-11”;??
????????new_item1[“time”]?=?“11:11:11”;??
????????arrayObj.append(new_item);??//?插入數(shù)組成員??
????????arrayObj.append(new_item1);?//?插入數(shù)組成員??
????????int?file_size?=?root[“files”].size();??
????????for(int?i?=?0;?i?<?file_size;?++i)??
????????????root[“files”][i][“exifs”]?=?arrayObj;???//?插入原json中?
????????std::string?out?=?root.toStyledString();??
????????//?輸出無格式j(luò)son字符串??
????????Json::FastWriter?writer;??
????????std::string?strWrite?=?writer.write(root);
????????std::ofstream?ofs;
????????ofs.open(“test_write.json”);
????????ofs?<<?strWrite;
????????ofs.close();
????}
is.close();??
}
總結(jié)
以上是生活随笔為你收集整理的C++ 解析Json的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux开发初步
- 下一篇: C++ 完全不完全资源导引