<thead id="dlkbl"></thead>
    <sub id="dlkbl"><del id="dlkbl"></del></sub>

  • <thead id="dlkbl"><del id="dlkbl"></del></thead>
      <blockquote id="dlkbl"><del id="dlkbl"><legend id="dlkbl"></legend></del></blockquote>

      (2)RapidJson的详解及使用

          本节主要介绍RapidJson是如何使用的。

       

        (1)RapidJson是什么

      RapidJson是一个跨平台的c++的json的解析器和生成器; 相比较jsoncpp库,RapidJson只有头文件,容易安装; RapidJSON 不依赖STL和boost等外部库独立; 只使用如下文件:<cstdio>, <cstdlib>, <cstring>, <inttypes.h>, <new>, <stdint.h>;
      高性能,使用模版及内联函数去降低函数调用开销、内部经优化的 Grisu2 及浮点数解析实现、可选的 SSE2/SSE4.2 支持.

       

        (2)RapidJson使用范例(DOM解析json字符串并修改json中指定元素的值)

      #include <iostream> #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h"
      
      using namespace std; using namespace rapidjson; int main(int argv ,char *argc[]) { //1.把JSON解析至DOM
        const char * strJson = "{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":100}"; Document doc; doc.Parse(strJson); cout<< strJson << endl; //2.利用DOM作出修改
        Value& v1 = doc["key2"]; v1="value_modify"; //v1.SetString("value_modify"); 
      Value
      & v2 = doc["key3"]; v2.SetInt(v2.GetInt()+1); //SetString() //SetBool() //SetUint() //SetInt64() //SetUInt64() //SetDouble() //SetFloat() //SetArray() //SetObject() //SetNull() //3.将DOM stringfy 为json StringBuffer buffer; Writer<StringBuffer> writer(buffer); doc.Accept(writer); cout<< buffer.GetString() << endl; return 0; }
      {"key1":"value1","key2":"value2","key3":100} {"key1":"value1","key2":"value_modify","key3":101}

       

        (3)文件对象模型(Document Object Model, DOM)API

          文件对象模型,在RapidJson中广泛的使用。

          1.构建json value到DOM:

      #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h"
      
      using namespace std; using namespace rapidjson; int main(int argv ,char *argc[]) { // 1.准备数据
        string name = "MenAngel"; string gender = "boy"; int age = 23; vector<string> hobbys = {"语文","数学","英语"}; map<string,double> score ={{"语文",80},{"数学",90},{"英语",100}}; // 2.初始化DOM
       StringBuffer strBuffer; Writer<StringBuffer> writer(strBuffer); //2.1 根DOM开始
       writer.StartObject(); writer.Key("name"); writer.String(name.c_str()); writer.Key("gender"); writer.String(gender.c_str());
      writer.Key("age");
      writer.Int(age); writer.Key(
      "hobby"); writer.StartArray(); for(auto &item : hobbys) { writer.String(item.c_str()); } writer.EndArray(); writer.Key("scores"); writer.StartObject(); for(auto &item : scores) { writer.Key((item.first).c_str()); writer.Double(item.second); } writer.EndObject(); //2.2 根DOM结束 writer.EndObject(); //3.将上述DOM组织的json数据写入json.txt文件 string outFileName = "json.txt"; ofstream outfile(outFileName,std::ios::trunc); outfile<<strBuffer.GetString()<<endl; outfile.flush(); outfile.close(); return 0; }
      {"name":"MenAngel","gender":"boy","age":23,"hobbys":["语文","数学","英语"],"scores":{"数学":90.0,"英语":100.0,"语文":80.0}}

          2.构建Json Value到DOM

      #include <iostream> #include <fstream> #include <vector> #include <map> #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h"
      
      using namespace std; using namespace rapidjson; int main(int argv ,char *argc[]) { // 1.准备数据
        string name = "MenAngel"; string gender = "boy"; int age = 23; vector<string> hobbys = {"语文","数学","英语"}; map<string,double> scores ={{"语文",80},{"数学",90},{"英语",100}}; //2.初始化DOM
       Document doc; Document::AllocatorType& allocator = doc.GetAllocator(); doc.SetObject();//实例化一个GenericValue到根DOM
       Value tempValue1; tempValue1.SetString(name.c_str(),allocator); doc.AddMember("name",tempValue1,allocator); Value tempValue2(rapidjson::kObjectType); tempValue2.SetString(gender.c_str(),allocator); doc.AddMember("gender",tempValue2,allocator); doc.AddMember("age",age,allocator); Value tempValue3(kArrayType); for(auto hobby:hobbys) { Value hobbyValue(kStringType); hobbyValue.SetString(hobby.c_str(),allocator); tempValue3.PushBack(hobbyValue,allocator); } doc.AddMember("hobbys",tempValue3,allocator); Value tempValue4(kObjectType); tempValue4.SetObject(); for(auto score : scores) { Value scoreValue(kNumberType); //cout<<score.second;
       scoreValue.SetInt(score.second); Value scoreName(kStringType); scoreName.SetString(score.first.c_str(),allocator); tempValue4.AddMember(scoreName,scoreValue,allocator); } doc.AddMember("scores",tempValue4,allocator); StringBuffer strBuffer; Writer<StringBuffer> writer(strBuffer); doc.Accept(writer); string outFileName = "json.txt"; ofstream outfile(outFileName,std::ios::trunc); outfile<<strBuffer.GetString()<<endl; outfile.flush(); outfile.close(); return 0; }
      {"name":"MenAngel","gender":"boy","age":23,"hobbys":["语文","数学","英语"],"scores":{"数学":90.0,"英语":100.0,"语文":80.0}}

          3.RapidJSon查询

      #include <iostream> #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h"
      using namespace std; using namespace rapidjson; int main(int argv,char *argc[]) { //1.构建json
        const char * strJson = "{\"name\":\"MenAngel\",\"age\":23,\"hobbys\":[\"语文\",\"数学\",\"英语\"]}"; Document doc; doc.Parse(strJson); StringBuffer strBuffer; Writer<StringBuffer> writer(strBuffer); doc.Accept(writer); cout<<strBuffer.GetString()<<endl; //2.查询json值
        cout<<"遍历方法一:"<<endl; int count = doc.MemberCount(); cout<<"doc 的属性成员有 "<<count<<"个!"<<endl; static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; int i = 0; for(Value::MemberIterator iter = doc.MemberBegin();iter != doc.MemberEnd();++iter) { cout<<++i<<".property "<<iter->name.GetString()<<" is "<<kTypeNames[iter->value.GetType()]<<endl; if(iter->value.GetType() == 4) { //3.遍历Array
            for(auto &item : iter->value.GetArray()) //IsBool、IsObject、IsInt、IsNull、IsNumber、IsDouble
              if(item.IsString()) cout<<"item = "<<item.GetString()<<endl; } } //4.查询某个成员是否存在
        Value::ConstMemberIterator it = doc.FindMember("scores"); if(it != doc.MemberEnd()) cout<<"Has Finded!"<<endl; else cout<<"Not Finded!"<<endl; //5.遍历doc的所有成员
        cout<<"遍历方法二:"<<endl; for(auto &m :doc.GetObject()) { cout<<"Has member :"<<m.name.GetString()<<" = "; if(m.value.IsString()) cout<<m.value.GetString()<<endl; if(m.value.IsInt()) cout<<m.value.GetInt()<<endl; if(m.value.IsBool()) cout<<m.value.GetBool()<<endl; if(m.value.IsArray()) cout<<"is array"<<endl; } return 0; }
      {"name":"MenAngel","age":23,"hobbys":["语文","数学","英语"]} 遍历方法一: doc 的属性成员有 3个!
      1.property name is String 2.property age is Number 3.property hobbys is Array item = 语文 item = 数学 item = 英语 Not Finded! 遍历方法二: Has member :name = MenAngel Has member :age = 23 Has member :hobbys = is array

          4.RapidJson属性获取

      #include <iostream> #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h"
      using namespace std; using namespace rapidjson; int main(int argv,char *argc[]) { //1.构建json
        const char * strJson = "{\"name\":\"MenAngel\",\"age\":23,\"hobbys\":[\"语文\",\"数学\",\"英语\"]}"; Document doc; doc.Parse(strJson); StringBuffer strBuffer; Writer<StringBuffer> writer(strBuffer); doc.Accept(writer); cout<<strBuffer.GetString()<<endl; //2.DOM根是一个对象
        if(doc.IsObject()) cout<<"doc is object!"<<endl; //3.doc不为j空
        if(!doc.IsNull()) { cout<<"doc is not null!"<<endl; } Document document; if(document.IsNull()) { cout<<"document is null!"<<endl; cout<<"Set Object"<<endl; document.SetObject(); } if(!document.IsNull()) cout<<"document is not null!"<<endl; //4.DOM 的大小.
        cout<<"doc.MemmberCount() = "<<doc.MemberCount()<<endl; //5.增加HasMember判断防止断言错误
        if(doc.HasMember("hobbys") && !doc["hobbys"].Empty()) cout<<"doc[\"hobbys\"] is not empty!"<<endl; else cout<<"member not exits!"<<endl; //6.取键值
        Value::ConstMemberIterator iter = doc.FindMember("age"); if(iter != doc.MemberEnd()) { cout<<"Member age is exits!"<<endl; cout<<iter->name.GetString()<<":"<<iter->value.GetInt()<<endl; } //7.Array的大小
        cout<<"doc[\"hobbys\"].Capacity() = "<<doc["hobbys"].Capacity()<<endl; //8.字符串的大小 当字符中存在\u0000时strlen会到此截断
        cout<<"doc[\"name\"].length = "<<strlen(doc["name"].GetString())<<endl; cout<<"doc[\"name\"].length = "<<doc["name"].GetStringLength()<<endl; doc.AddMember("test","a\u0000b",doc.GetAllocator()); //只能当test成员存在时才能直接赋值 //doc["test"] = "a\u0000b";
        cout<<"doc[\"test\"].length = "<<strlen(doc["test"].GetString())<<endl; cout<<"doc[\"test\"].length = "<<doc["test"].GetStringLength()<<endl; //   return 0; }
      {"name":"MenAngel","age":23,"hobbys":["语文","数学","英语"]} doc is object! doc is not null! document is null! Set Object document is not null! doc.MemmberCount() = 3 doc["hobbys"] is not empty! Member age is exits! age:23 doc["hobbys"].Capacity() = 3 doc["name"].length = 8 doc["name"].length = 8 doc["test"].length = 1 doc["test"].length = 3

          5.RapidJson一些特性

      #include <iostream> #include <stdio.h> #include <stdlib.h> #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h"
      using namespace std; using namespace rapidjson; int main(int argv,char *argc[]) { //1.构建json
        const char * strJson = "{\"name\":\"MenAngel\",\"age\":23,\"hobbys\":[\"语文\",\"数学\",\"英语\"]}"; Document doc; doc.Parse(strJson); StringBuffer strBuffer; Writer<StringBuffer> writer(strBuffer); doc.Accept(writer); cout<<strBuffer.GetString()<<endl; //2.const char *、string、value(kStringType)之间比较大小
        if(doc["name"] == "MenAngel") cout<<"(1)doc[\"name\"] equal MenAngel!"<<endl; if(doc["name"].GetString() == string("MenAngel")) cout<<"(2)doc[\"name\"] equal MenAngel!"<<endl; if( 0 == strcmp(doc["name"].GetString(),"MenAngel")) cout<<"(3)doc[\"name\"] equal MenAngel!"<<endl; if(doc["name"].GetString() != "MenAngel") cout<<"(4)不成立!"<<endl; //3.value赋值
        Value v;//v is NULL && v is not Object
        if(v.IsNull()) cout<<"v is Null()"<<endl; v.SetObject(); if(v.IsObject()) cout<<"v is Object"<<endl; Value tValue(kObjectType);//tValue is not Null,tValue is Object
        if(!tValue.IsNull()) cout<<"tVlaue is not NULL!"<<endl; if(tValue.IsObject()) cout<<"tValue is Object"<<endl; //4.转移语义,避免value深赋值 //AddMember(), PushBack()、赋值均采用深赋值
        Value a(123); Value b(456); a = b; if(b.IsNull()) cout<<"b is Null,"<<"a = "<<a.GetInt()<<endl; Value c(kArrayType); Document::AllocatorType& allocator = doc.GetAllocator(); c.PushBack(Value(11), allocator); c.PushBack(Value().SetInt(22), allocator); // fluent API
        c.PushBack(Value(33).Move(), allocator);   // 转移语义
        cout<<"c.Capacity() = "<<c.Capacity()<<endl; cout<<"c.Size() = "<<c.Size()<<endl; for(auto &m : c.GetArray()) { cout<<"item = "<<m.GetInt()<<endl; } //字符串的容量及大小
        cout<<"doc[\"hobbys\"].Size() = "<<doc["hobbys"].Size()<<endl; cout<<"doc[\"hobbys\"].Capacity() = "<<doc["hobbys"].Capacity()<<endl; //5.交换value
        Value d(123); Value e("string"); d.Swap(e); if(!d.IsNull() && !e.IsNull()) { cout<<"d is not null,e is not null!"<<endl; cout<<"d = "<<d.GetString()<<" e = "<<e.GetInt()<<endl; } //6.创建string //复制字符串
       Value f(kStringType); char str[20] = "My first string!"; f.SetString(str,doc.GetAllocator()); cout<<f.GetString()<<endl; Value g; char buffer[20]; int len = sprintf(buffer, "%s -> %s", "name", "value"); // 动态创建的字符串。
       g.SetString(buffer,len,doc.GetAllocator()); //g.SetString(buffer,doc.GetAllocator())
        cout<<g.GetString()<<endl; //简单引用常量字符串
       Value h; h.SetString("My third String!");// h = "My thrid String!"
        cout<<h.GetString()<<endl; //简单引用常量l字符串
       Value i; const char * tempStr = "my fourth string"; size_t cstr_len = strlen(tempStr); i.SetString(StringRef(tempStr)); //i.SetString(StringRef(tempStr,cstr_len)); //i = StringRef(tempStr,cstr_len) //i = StringRef(tempStr) //i.SetString(tempStr); 不合法
        cout<<i.GetString()<<endl; return 0; }
      {"name":"MenAngel","age":23,"hobbys":["语文","数学","英语"]} (1)doc["name"] equal MenAngel! (2)doc["name"] equal MenAngel! (3)doc["name"] equal MenAngel! (4)不成立! v is Null() v is Object tVlaue is not NULL! tValue is Object b is Null,a = 456 c.Capacity() = 16 c.Size() = 3 item = 11 item = 22 item = 33 doc["hobbys"].Size() = 3 doc["hobbys"].Capacity() = 3 d is not null,e is not null! d = string e = 123 My first string! name -> value My third String! my fourth string
      相关文章
      相关标签/搜索
      4887王中王鉄算盘开奖结 汤原县| 吕梁市| 浮山县| 古交市| 连江县| 大方县| 北碚区| 屯门区| 黎川县| 大名县| 太白县| 西充县| 辽中县| 九江市| 南充市| 新余市| 平阳县| 平昌县| 永靖县| 晴隆县| 沭阳县| 宁强县| 武城县| 汶上县| 灯塔市| 江西省| 宽城| 炎陵县| 泸州市| 运城市| 丹寨县| 囊谦县| 遵化市| 托里县| 东宁县| 辛集市| 五家渠市| 十堰市| 兴隆县| 万宁市| 利津县| 拉萨市| 常熟市| 芦山县| 冀州市| 海淀区| 渝北区| 进贤县| 延吉市| 虎林市| 平潭县| 元氏县| 肇庆市| 唐山市| 信阳市| 宁国市| 武定县| 泗阳县| 林州市| 娱乐| 明水县| 大连市| 侯马市| 隆安县| 东莞市| 龙门县| 青阳县| 牟定县| 苏尼特左旗| 汝城县| 孟州市| 桃园县| 桃江县| 改则县| 沂水县| 西华县| 松滋市| 金华市| 庆元县| 麻城市| 邳州市| 阿图什市| 道真| 呼玛县| 四会市| 乌恰县| 三穗县| 衡阳县| 翁源县| 容城县| 定陶县| 浙江省| 郯城县| 汝阳县| 宁化县| 融水| 垫江县| 焦作市| 华阴市| 定结县| 蒲江县| 独山县| 青河县| 曲水县| 明水县| 英德市| 湘阴县| 英山县| 洞口县| 佳木斯市| 泗洪县| 庐江县| 迁西县| 武冈市| 称多县| 孟州市| 龙胜| 德化县| 富民县| 连云港市| 元阳县| 马鞍山市| 灯塔市| 绍兴县| 镇坪县| 始兴县| 砀山县| 宜丰县| 丰城市| 哈密市| 乌兰县| 淅川县| 关岭| 临颍县| 平顶山市| 文昌市| 剑川县| 鲜城| 保德县| 瑞丽市| 汝南县| 胶南市| 多伦县| 南投县| 宁津县| 灵寿县| 沅陵县| 化隆| 象州县| 依兰县| 芦溪县| 沭阳县| 勃利县| 郎溪县| 南安市| 永定县| 宝应县| 泗水县| 清水河县| 栖霞市| 嘉黎县| 呼玛县| 蕉岭县| 繁峙县| 洛宁县| 上林县| 泸州市| 香格里拉县| 常熟市| 虎林市| 泰宁县| 林甸县| 呼伦贝尔市| 通海县| 新绛县| 白河县| 田东县| 晋江市| 新闻| 盈江县| 汝阳县| 内江市| 华池县| 牟定县| 昌都县| 湘潭市| 项城市| 中山市| 金溪县| 潍坊市| 昌图县| 西宁市| 法库县| 绿春县| 台州市| 民勤县| 毕节市| 大安市| 商洛市| 莱西市| 遵义市| 怀仁县| 武鸣县| 雷波县| 伊金霍洛旗| 太白县| 雷州市| 桃源县| 正镶白旗| 定南县| 澳门| 峨眉山市| 铁岭市| 辰溪县| 台南市| 武夷山市| 司法| 丽水市| 长宁区| 滨州市| 铁岭县| 北京市| 墨竹工卡县| 潼关县| 襄城县| 普兰店市| 吉安县| 乌苏市| 商城县| 灵武市| 新巴尔虎右旗| 虹口区| 电白县| 辽中县| 乾安县| 平潭县| 丹东市| 东至县| 固镇县| 遵义市| 改则县| 新龙县| 定结县| 孟津县| 若尔盖县| 洪雅县| 开原市| 威海市| 江北区| 克拉玛依市| 湖北省| 东源县| 清水县| 麻江县| 翁源县| 灌南县| 迁安市| 青铜峡市| 积石山| 乌拉特中旗| 北川| 宁晋县| 辰溪县| 永仁县| 库伦旗| 石城县| 余江县| 汝城县| 定日县| 昌吉市| 威信县| 津市市| 平远县| 翁牛特旗| 丹江口市| 灵石县| 金阳县| 阳高县| 西畴县| 五常市| 贺州市| 普定县| 林芝县| 饶阳县| 泗阳县| 麦盖提县| 马鞍山市| 拉孜县| 合阳县| 巴青县| 化州市| 政和县| 奉贤区| 那曲县| 罗山县| 外汇| 乌鲁木齐县| 遵义市| 尼勒克县| 乌什县| 永泰县| 云安县| 崇左市| 尖扎县| 临西县| 大姚县| 开远市| 邓州市| 无为县| 托克逊县| 鄢陵县| 五寨县| 和平县| 天镇县| 宜黄县| 德昌县| 乌拉特前旗| 洛南县| 昌黎县| 黄石市| 阆中市| 元阳县| 盐源县| 洛川县| 永仁县| 剑河县| 安远县| 南宫市| 商城县| 太康县| 石城县| 赫章县| 东乌珠穆沁旗| 万安县| 油尖旺区| 鲜城| 寻甸| 石首市| 平塘县| 龙胜| 通榆县| 繁昌县| 内黄县| 体育| 延寿县| 中西区| 四会市| 上栗县| 太白县| 临朐县| 运城市| 博爱县| 定西市| 通化市| 南部县| 奇台县| 玉溪市| 巴楚县| 滦南县| 东阳市| 阿鲁科尔沁旗| 密云县| 若尔盖县| 苏尼特左旗| 任丘市| 沙田区| 隆德县| 南阳市| 池州市| 马山县| 绥德县| 河间市| 绍兴县| 和静县| 和平区| 兴化市| 吴江市| 肇源县| 哈巴河县| 卢氏县| 信阳市| 鱼台县| 凌源市| 富民县| 舞阳县| 繁峙县| 阿拉尔市| 上犹县| 平凉市| 凉山| 马边| 古交市| 阳信县| 山丹县| 昌吉市| 吴堡县| 南溪县| 万盛区| 封开县| 宾川县| 钦州市| 高清| 仪征市| 崇信县| 宝清县| 阿克陶县| 本溪市| 林芝县| 英山县| 临泽县| 安泽县| 睢宁县| 聊城市| 化州市| 江油市| 赤壁市| 长丰县| 蕲春县| 红安县| 金华市| 高邑县| 石泉县| 宁陵县| 临漳县| 汉阴县| 安丘市| 景东| 嘉义市| 芷江| 民丰县| 盘锦市| 梁平县| 班玛县| 奎屯市| 普洱| 攀枝花市| 古丈县| 宁德市| 山西省| 屏东市| 盐边县| 深泽县| 阜宁县| 陇西县| 法库县| 黄冈市| 习水县| 建平县| 丹寨县| 金沙县| 大邑县| 丰都县| 德江县| 六安市| 南昌市| 徐汇区| 西吉县| 天津市| 甘泉县| 广灵县| 汉源县| 磐石市| 二连浩特市| 南通市| 阳信县| 措勤县| 湘潭县| 深泽县| 威信县| 南投市| 塔城市| 木里| 大埔县| 厦门市| 新龙县| 阳西县| 无极县| 紫金县| 丰都县| 吐鲁番市| 陵川县| 永安市| 白水县| 广元市| 曲水县| 平顶山市| 英吉沙县| 紫金县| 黑水县| 浠水县| 栾川县| 抚顺县| 大姚县| 德钦县| 古田县| 彰化县| 临安市| 万宁市| 巴林左旗| 新乡县| 贡山| 平塘县| 图木舒克市| 乡宁县| 庄河市| 武陟县| 商丘市| 马尔康县| 黑山县| 通辽市| http://m.jp1860weathero.fun http://jp1860waveo.fun http://bbs.jp1860contesto.fun http://3g.jp1860suno.fun http://wap.jp1860exerciseo.fun http://m.jp1860coupleo.fun http://jp1860silvero.fun http://bbs.jp1860bulletino.fun http://3g.jp1860aido.fun http://www.jp1860trailo.fun http://jp1860perforzo.fun http://bbs.jp1860advantageo.fun http://wap.jp1860zeroo.fun http://m.jp1860carto.fun http://jp1860appealo.fun