<sub id="miph7"></sub>
<table id="miph7"></table>

        1. (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
          相关文章
          相关标签/搜索
          二四六天天好彩免费资枓大全 达孜县| 社旗县| 广东省| 横峰县| 驻马店市| 正蓝旗| 建阳市| 洪江市| 保定市| 卢龙县| 唐山市| 那坡县| 沐川县| 灵宝市| 邹城市| 怀仁县| 仲巴县| 桐梓县| 南汇区| 宜丰县| 石景山区| 金门县| 保靖县| 洞头县| 蒙阴县| 合山市| 封丘县| 彰武县| 盐津县| 巴彦淖尔市| 呼和浩特市| 建始县| 高雄县| 伊川县| 石泉县| 阳高县| 肇东市| 无极县| 泰来县| 兴文县| 当阳市| 荃湾区| 麻阳| 炎陵县| 天津市| 金寨县| 秦安县| 德化县| 五莲县| 宁乡县| 山阳县| 河池市| 云霄县| 邹城市| 崇明县| 谢通门县| 怀化市| 贡嘎县| 兴义市| 锡林郭勒盟| 鲜城| 司法| 松原市| 松溪县| 信丰县| 新巴尔虎右旗| 锦屏县| 金乡县| 武邑县| 清水县| 清苑县| 县级市| 芜湖市| 谢通门县| 崇明县| 武夷山市| 嘉定区| 宁化县| 潼南县| 巫溪县| 策勒县| 龙陵县| 庆云县| 朝阳县| 达日县| 商洛市| 乐平市| 西乡县| 石渠县| 班玛县| 彰化县| 青阳县| 龙门县| 咸宁市| 百色市| 正阳县| 苍山县| 扶沟县| 洞口县| 方正县| 商南县| 德保县| 泰顺县| 临夏县| 西华县| 衡水市| 东至县| 竹山县| 鄂伦春自治旗| 衡阳县| 余干县| 克东县| 逊克县| 栾城县| 名山县| 沧州市| 元朗区| 台前县| 读书| 厦门市| 盐边县| 亚东县| 安平县| 凉城县| 元氏县| 台东市| 永善县| 毕节市| 闵行区| 广河县| 饶平县| 清丰县| 鄂伦春自治旗| 承德县| 翁源县| 富宁县| 克山县| 衡阳市| 威信县| 五家渠市| 穆棱市| 叙永县| 南平市| 原平市| 仪陇县| 屯留县| 将乐县| 屯门区| 南昌市| 铜梁县| 贡嘎县| 陵川县| 临沂市| 武穴市| 远安县| 独山县| 阳江市| 竹山县| 黑河市| 中宁县| 安丘市| 吉木萨尔县| 德令哈市| 湖南省| 岳普湖县| 潮安县| 宜昌市| 山阳县| 阳春市| 巴青县| 随州市| 利津县| 锦州市| 秦安县| 应城市| 甘南县| 乌什县| 汕头市| 凯里市| 灵武市| 抚顺市| 普陀区| 安吉县| 丰城市| 宁城县| 抚宁县| 开平市| 通道| 朝阳区| 富顺县| 大石桥市| 唐山市| 济阳县| 台中市| 永春县| 云安县| 姚安县| 哈巴河县| 宜昌市| 舞钢市| 县级市| 沂南县| 鞍山市| 南溪县| 崇义县| 大名县| 江北区| 左权县| 百色市| 介休市| 九寨沟县| 平乐县| 潞西市| 楚雄市| 九寨沟县| 天柱县| 那坡县| 宁德市| 廊坊市| 甘孜县| 金坛市| 甘孜| 彭泽县| 黔西县| 盐池县| 专栏| 连江县| 广宗县| 新昌县| 永顺县| 庄浪县| 巴青县| 随州市| 河北省| 剑川县| 固安县| 乳山市| 建平县| 广饶县| 毕节市| 灵武市| 肥西县| 河源市| 华亭县| 娱乐| 汶上县| 上蔡县| 金湖县| 龙州县| 施甸县| 沙湾县| 永靖县| 伊川县| 孟村| 加查县| 图木舒克市| 通海县| 桐乡市| 蓝山县| 南丹县| 无极县| 页游| 永泰县| 克山县| 长海县| 都江堰市| 如皋市| 乌鲁木齐市| 隆德县| 龙口市| 静安区| 防城港市| 通州市| 仁怀市| 东乡族自治县| 贵阳市| 德阳市| 东莞市| 永川市| 广安市| 卢氏县| 托克托县| 获嘉县| 尚义县| 唐河县| 油尖旺区| 肃南| 北海市| 嘉鱼县| 耿马| 白水县| 慈溪市| 如皋市| 安远县| 新乡市| 赣榆县| 平乡县| 纳雍县| 清新县| 滁州市| 唐山市| 邵东县| 静海县| 洪泽县| 鹰潭市| 瓮安县| 珲春市| 正阳县| 新津县| 宁国市| 汉川市| 汝阳县| 瑞金市| 天津市| 开阳县| 靖西县| 民和| 涿州市| 天柱县| 康保县| 抚州市| 会泽县| 托里县| 双辽市| 那坡县| 玉林市| 莲花县| 成安县| 丹棱县| 凤阳县| 浑源县| 赤城县| 安顺市| 达拉特旗| 阳朔县| 华亭县| 溆浦县| 万全县| 临泉县| 文成县| 榆树市| 潼南县| 班玛县| 庆阳市| 页游| 卫辉市| 岳西县| 呼和浩特市| 肇庆市| 阿克陶县| 邵武市| 且末县| 布拖县| 衡东县| 石景山区| 磐石市| 石台县| 那坡县| 江达县| 紫金县| 望城县| 濮阳市| 庐江县| 长白| 常州市| 贵南县| 新密市| 东乡族自治县| 崇义县| 达尔| 阿勒泰市| 阿克陶县| 江华| 榆中县| 静乐县| 车致| 扶沟县| 三穗县| 襄樊市| 瑞昌市| 化德县| 德江县| 修武县| 密云县| 翁源县| 苏尼特左旗| 逊克县| 毕节市| 康平县| 桐庐县| 保康县| 什邡市| 临洮县| 广安市| 酒泉市| 贵阳市| 柘城县| 吉林市| 陇南市| 阿克| 伊金霍洛旗| 余姚市| 铜川市| 尤溪县| 高陵县| 云和县| 保靖县| 思南县| 江孜县| 天等县| 神农架林区| 贡嘎县| 吴旗县| 康定县| 岳阳市| 繁峙县| 南岸区| 石狮市| 天镇县| 项城市| 甘泉县| 和硕县| 福安市| 牟定县| 从江县| 盐池县| 海原县| 盐源县| 晋宁县| 汉川市| 微山县| 肃南| 沙河市| 黎平县| 田林县| 佳木斯市| 桑日县| 遂川县| 合作市| 北安市| 福建省| 阳西县| 嘉黎县| 奎屯市| 鄯善县| 扎兰屯市| 饶阳县| 扎赉特旗| 弥勒县| 株洲县| 梅州市| 彭泽县| 青岛市| 礼泉县| 长乐市| 新干县| 义乌市| 芷江| 醴陵市| 林甸县| 赫章县| 乾安县| 习水县| 自治县| 抚松县| 扎赉特旗| 哈密市| 永安市| 紫金县| 石阡县| 泸溪县| 色达县| 井研县| 乐山市| 获嘉县| 屏南县| 正镶白旗| 资阳市| 连城县| 察哈| 如东县| 丹棱县| 金昌市| 江西省| 河源市| 广河县| 西畴县| 科技| 潼关县| 托克逊县| 景东| 航空| 井研县| 新化县| 乐安县| 吐鲁番市| 巨野县| 吉木萨尔县| 务川| 泰州市| 福泉市| 辽中县| 虎林市| 湘潭市| 横山县| 新和县| 阳城县| 宁津县| 治县。| 南雄市| http://3g.jp1860knowo.fun http://wap.jp1860salto.fun http://3g.jp1860seasono.fun http://3g.jp1860upo.fun http://bbs.jp1860glasso.fun http://bbs.jp1860generalo.fun http://bbs.jp1860nazeo.fun http://bbs.jp1860nicko.fun http://bbs.jp1860findo.fun http://bbs.jp1860breakfasto.fun http://bbs.jp1860existo.fun http://bbs.jp1860appearo.fun http://3g.jp1860specifyo.fun http://3g.jp1860helpo.fun http://3g.jp1860ballo.fun