日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 解析Json

發(fā)布時間:2023/12/20 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 解析Json 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)上找的代碼示例:

  • 從字符串解析json
    ? ??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();??
    }

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的C++ 解析Json的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。