cocos2dx中的Rapidjson
1 Json基础
JSON 概念和特点:
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式,类似 XML,但比 XML 更小、更快,更易解析
JSON 独立于语言 *
JSON 具有自我描述性,更易理解 。
JSON的创建方式与创建 JavaScript 对象的代码相同。
Json的格式:
{
"project_type": "javascript",
"debugMode" : 1,
"showFPS" : true,
"frameRate" : 60,
"id" : "gameCanvas",
"renderMode" : 0,
"engineDir":"frameworks/cocos2d-html5",
"modules" : ["cocos2d", "extensions"],
"jsList" : [
"src/loader/loaderRes.js",
"src/loader/loaderScene.js"
]
}
JSON 值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在方括号中)
对象(在花括号中)
null。
JSON 是 JavaScript 原生格式。JavaScript可以直接使用JSON,不需要调用api或工具包。
由于JSON的易用性,其他语言也提供了强大的JSON 解析器和 JSON 库。c++语音有28种json库。下面的图表是对28种json库的评估:
符合标准程度(越高越好):
解析至DOM的时间(越低越好):
把DOM生成含换行及缩进的JSON的时间(越低越好):
可执行文件(把JSON解析至DOM,然后统计JSON类型)的大小(越低越好):
2 使用Rapidjson解析字符串成json格式数据
1、创建一个rapidjson::Document对象rapidJson的相关操作都在Document类中
rapidjson::Document
2、调用Parse方法解析json数据
doc.Parse<0>(data.c_str());
3、使用HasParseError()判断解析出来的document是否正确。解析正确才能做进一步操作。
rapidjson::Document doc;
doc.Parse<>(str.c_str());
if (doc.HasParseError())
{
log("json parse error : %s",doc.GetParseError());
}else//解析成功之后的操作
{
log("parse success");
if (doc.IsObject()&&doc.HasMember("data"))
{
rapidjson::Value &value = doc["data"];
if (value.IsString())
{
log("data is :%s",value.GetString());
}
} if (doc.IsObject()&&doc.HasMember("json"))
{
doc["json"].SetInt();
log("json is :% d",doc["json"].GetInt() );
}
3 使用Rapidjson读取和更改数据
在rapidJson中,使用rapidjson::Value代表json数据中的值。
rapidjson::Value其实就是js中的var,可以把rapidjson::Value当作int,也可以当作string,也可以当作数组等。对于定义rapidjson::Value value,只是一个定义,还没有决定其数据类型,如果明确value的类型,再转成相应的格式。
Value的类型包括int,Double,string,bool,array,obejct,null。
json使用key-value的方式,读取数据时使用脚标的方式,在获取脚本之前,还可以使用HasMember方法判断是否有这个键值对:
rapidjson::Value &value=doc["hello"];
然后判断value的类型:value.IsString()判断是否是字符串,IsArray()判断是否是数组等
判断好数据的类型后,可以调用对应的方法获取c/c++数据类型。比如如果value是字符串,则可以通过getString方法获取字符串的值。
并且可以通过SetString方法修改该value的值。
除了修改value的值,也可以修改value的类型,通过set+类型的方法设置,有下面这些方法可以设置value的值。
vall.SetArray()
vall.SetArrayRaw()
vall.SetBool()
vall.SetDouble()
vall.SetInt()
vall.SetNull()
vall.SetObject()
vall.SetString()
vall.SetStringRaw()
vall.SetUint();
vall.SetUint64()
4 把json数据转成字符串
使用rapidjson::Writer 把 rapidjson::Value 转成符合json数据格式的字符串:
先声明一个rapidjson::StringBuffer类型的数据
rapidjson::StringBuffer buffer;
再创建一个rapidjson::Writer对象
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
doc.Accept(writer);
然后就可以通过buffer.GetString()获取c/c++的字符串了。
5 使用Rapidjson添加、删除数据
Rapidjson除了能够读取和修改数据,还能添加和删除数据。
添加数据时,先获取一个分配器
rapidjson::Document::AllocatorType &allocator = doc.GetAllocator();
添加一个数:
doc.AddMember("age",15,allocator);
添加一个字符串:
doc.AddMember("name","liao li",allocator);
///添加一个null对象
rapidjson::Value nullObject(rapidjson::kNullType);
doc.AddMember("null",nullObject,allocator);///<往分配器中添加一个对象
添加一个对象:
rapidjson::Value object(rapidjson::kObjectType);///<创建数组里面对象。
object.AddMember("age",40,allocator);
object.AddMember("name","father ",allocator);
doc.AddMember("father",object,allocator);
///添加一个数组对象
rapidjson::Value array(rapidjson::kArrayType);///<创建一个数组对象
array.PushBack(1,allocator);
array.PushBack(2,allocator);
array.PushBack(3,allocator);
doc.AddMember("array",array,allocator)
///在已有的数组中添加一个成员对象
rapidjson::Value &aArray1=doc["array"];
aArray1.PushBack(4,allocator);
cocos2dx中的Rapidjson的更多相关文章
- cocos2d-x中几种存储数据的方式
说明:本文所论述内容均基于cocos2dx 3.0 版本. 1.UserDefault 它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 查看CCUserDefault文件,可以 ...
- Cocos2dx中线程优先级
Cocos2dx中线程优先级问题 不论是ios还是android,遇到耗时的任务都要另起线程处理,否则程序不能及时用户的反馈.游戏中如果一圈循环不能在1/frameRate(帧率是30则1/30)秒内 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术
在上一篇博客中,我们一起学习了如何在Cocos2d-x中存储数据和读取信息,本篇博客我们将一起讨论和数据存储同样重要的联网技术. 一.弱联网技术介绍 在网络游戏中许多重要的功能都需要网络连接,而根据需 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术
一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得 ...
- cocos2dx 中使用的一些C++ 11 特性
0. placeholder 头文件:<functional> namespace: placeholder placeholder 就是一堆帮助bind占参数位置的东西,名字分别为 _ ...
- cocos2dx中CC_CALLBACK_1等宏中this指针实际指向
首先看代码,我在Helloworld中添加两个函数. void HelloWorld::addTarget(){ Size visibleSize = Director::getInstance()- ...
- cocos2d-x 中的坐标系
cocos2d-x 中的坐标系是笛卡尔坐标系,向右为 x 轴正方向,向上为 y 轴正方向,以像素为单位 原点在屏幕左下角的坐标系叫世界坐标系,是整个游戏中的根基,直接添加到场景中的节点,设置的位置都是 ...
- cocos2d-x 中的基本概念
在 cocos2d-x 开头配置(Windows 平台)中,介绍了新建工程,这篇就介绍下 cocos2d-x 的一些概念.(前提是需要有C++的面向对象的基本知识和C++11的常用知识) 层,场景,导 ...
- WP8:在Cocos2d-x中使用OpenXLive
一. Cocos2d-x for Windows Phone 到2013年底,几大手游引擎都陆续支持WP8了,特别是Unity3D和Cocos2d-x.有过游戏开发经验的朋友们应该对这两个引擎不 ...
随机推荐
- SQLyog中的计算适合的数据类型
可能使用的数据库工作比较杂吧(机器上有toad.PLSQL Developer.Navicat.SQLyog等).并非是觉得那种都不好用,而是觉得有适合大部分需求的,但也有工具在某一方面特别方便的. ...
- 分布式_理论_01_CAP定理
一.前言 五.参考资料 1.分布式理论(一) - CAP定理——零壹技术栈 2.分布式理论(一) —— CAP 定理——莫那一鲁道 3.分布式系统理论基础 - CAP 4.分布式系统的CAP理论
- IDEA+testng,输出没有test-output目录
参考:http://www.cnblogs.com/veitch-623/p/6192601.html 在Edit Configurations里 使用默认报告就行
- github提交代码时遇到”Everything up-to-date“问题的解决方式
需要创建一个新分支,将最新代码加入新分支, 再将新分支合并到主分支,然后提交主分支代码到github网站. ---------------------------------------------- ...
- UVA 11988 Broken Keyboard (a.k.a. Beiju Text) (链表,模拟)
使用list来模拟就行了,如果熟悉list,那么这道题真是分分钟秒掉... list是双向循环链表,插入和删除操作非常快,缺点是不能像数组一样随机按下标读取. 一下是wiki上说明的相关函数:http ...
- 不同OpenCV版本和不同VS版本之间进行配置的注意事项
下面内容为不同系统和不同版本VS+不同版本OpenCV之间进行配置时的注意事项.本教程中开始提到如果VS版本和OpenCV版本相匹配的话,只要按上述步骤配置都是没有问题的.但是如果说版本不匹配的话,就 ...
- Java 参数的和
public class CommandParamter { public static void main(String[] args) { // TODO Auto-generated metho ...
- Dubbo与Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- Python collections系列之默认字典
默认字典(defaultdict) defaultdict是对字典的类型的补充,它默认给字典的值设置了一个类型. 1.创建默认字典 import collections dic = collecti ...
- 蓝桥杯 基础练习 BASIC-23 芯片测试
基础练习 芯片测试 时间限制:1.0s 内存限制:512.0MB 问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多. 每个芯片都能用来测试其他芯片.用好芯片测试其他芯片时, ...