rapidjson 学习笔记
来源:互联网 发布:网络数字用语骂人 编辑:程序博客网 时间:2024/05/16 10:11
官方文档
https://code.google.com/p/rapidjson/wiki/UserGuide
rapidjson是一个快速解析json文件的C++库。cocostudio就使用了该库!!!
对于使用者来说,我们只需要知道两个类:
value和Document。其中Document派生自Value。(这里都是模板特化后的名字,原名字为GenericValue<...>和GenericDocument<...>
value中定义了Number, Object,String,Array等struct。然后再用一个Union将这些struct放在一起!
union Data {String s;Number n;Object o;Array a;};
Value其实很简单,就只有两个数据成员:Data data_和 unsigned flags_
其中flag标识该value的具体类型,
enum {kBoolFlag = 0x100,kNumberFlag = 0x200,kIntFlag = 0x400,kUintFlag = 0x800,kInt64Flag = 0x1000,kUint64Flag = 0x2000,kDoubleFlag = 0x4000,kStringFlag = 0x100000,kCopyFlag = 0x200000,// Initial flags of different types.kNullFlag = kNullType,kTrueFlag = kTrueType | kBoolFlag,kFalseFlag = kFalseType | kBoolFlag,kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag,kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag,kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag,kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag,kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag,kConstStringFlag = kStringType | kStringFlag,kCopyStringFlag = kStringType | kStringFlag | kCopyFlag,kObjectFlag = kObjectType,kArrayFlag = kArrayType,kTypeMask = 0xFF// bitwise-and with mask of 0xFF can be optimized by compiler};若flag为kNumberFlag ,则data中的number中的数据有效。若flag为 kStringFlag 则data中的string有效。同理, kObjectFlag 和 kArrayFlag 对应data中的object和array。
下面试试如何使用rapidjson。
json中文件内容为:
[["id","quest"],[1,"quest001"],[2,"quest002"]]json文件中“[]”包裹的是数组,"{}"包裹的是对象,k-v用“key”:“value”的形式表示。
下面开始解析这个文件
Document doc;std::string data = FileUtils::getInstance()->getStringFromFile("haha.json");doc.Parse<kParseDefaultFlags>(data.c_str());只需这三部,json就被解析到了doc中,此时,doc中的flag标识为kArrayFlag。接下来就是从doc中获取值了。如何从数组中获取值呢?rapidjson重载了下标运算符"[]"。在下标中传入索引,就能获取到对应的的Value了。但这里有一点要特别注意!!!就是在接收返回值时,一定要用引用!如auto& t = doc[i];这里如果写成auto t = doc[i]则编译失败!!!因为Value的拷贝构造函数为private的!!!
auto& t = doc[1];for (int i = 0; i < t.Size(); i++){auto& ele = t[i];if (ele.IsInt())CCLOG("%d", ele.GetInt());else if (ele.IsString())CCLOG(ele.GetString());else if (ele.IsBool())if (ele.GetBool())CCLOG("true");elseCCLOG("false");elseCCLOG("flag error");}
t其实还是一个数组(其实就是第一行["id", "quest"]),获取它里面的元素也用下标运算符。ele为数组t中的元素。此for循环可以打印出json文件中第一行的内容。
除了用下标实现循环遍历,rapidjson还提供了迭代器!迭代器有针对object和针对array两种!针对array的为onBegin何onEnd。此外,rapidjson还提供了一些易于操作的其他接口……可查看源码,一一了解
0 0
- rapidjson 学习笔记
- 【腾讯RapidJSON】学习笔记
- Rapidjson学习笔记
- RapidJSON学习整理
- rapidjson
- Cocos2dx学习笔记37 Json 数据解析rapidjson库的使用
- 【RapidJson】Rapidjson解析
- cocos2dx学习之rapidjson库json数据解析
- rapidjson使用
- rapidjson 使用
- RapidJSON简介
- rapidjson 解析
- RapidJSON 介绍
- rapidjson 使用
- rapidjson解析
- rapidjson解析
- rapidjson操作指南
- RapidJson 解析(1)
- 反转链表
- 访问者模式 双重分派分析 与 accept方法存在的必要性
- 表:链表环问题总结
- 小蚂蚁你这是在干什么呀
- 494 - Kindergarten Counting Game
- rapidjson 学习笔记
- 从myeclipse导入eclipse,不能识别为web项目(java项目转为web项目) 转
- Powercenter 基础知识介绍- 4
- Android进程与线程详解
- Oracle中having1子句的用法
- 将多个js函数绑定到onload事件上
- 线程启动start后,如何停止的?
- iOS学习之二十:应用的归档打包以及distribution测试和上传到App Store
- JS 控制check复选框全选/反选