Rapidjson的简单使用示例
很早就想用用Markdown了,一直没机会。今天就来试一下
先放个目录:
rapidjson官方教程
如果要想深入学习rapidjson工具,官方文档肯定是必须看一看的。官方教程里面的讲解才是最详细,最权威的了。
本示例所用环境
- 引擎版本:cocos2d-x 3.10
示例代码与注释
说明:我是直接使用原版引擎创建了新的cocos2dx工程,然后略微修改了HelloWorldScene.cpp中的代码。为了方便,使用rapidjson生成json串、保存json串到文件、从文件读取json串、使用rapidjson解析json串的过程,全部写到了initSelf()函数中。
本身很反感blog全篇粘代码的方式(关键贴的代码谁都看不懂,一行注释没有),但是这部分代码示例没有什么可说的,所以在重点部分写了注释。
HelloWorldScene.h文件内容
#include "cocos2d.h"
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld);
private:
void initSelf();
};
HelloWorldScene.cpp文件内容
#include "HelloWorldScene.h"
#include "json/rapidjson.h"
#include "json/document.h"
#include "json/filestream.h"
#include "json/stringbuffer.h"
#include "json/writer.h"
USING_NS_CC;
Scene* HelloWorld::createScene()
{
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
else {
this->initSelf();
return true;
}
}
//重点
void HelloWorld::initSelf()
{
//生成一串如下的json格式字符串,并解析
// {
// "name":"qfl",
// "age":20,
// "letter":["a","b","c"],
// "location": {"province":"fujian","city":"xiamen","number":16}
// "book":[{"name":"book1", "isbn":"123"},{"name":"book2","isbn":"456"}],
// "healthy":true,
// }
//生成Json串
rapidjson::Document jsonDoc; //生成一个dom元素Document
rapidjson::Document::AllocatorType &allocator = jsonDoc.GetAllocator(); //获取分配器
jsonDoc.SetObject(); //将当前的Document设置为一个object,也就是说,整个Document是一个Object类型的dom元素
//添加属性
jsonDoc.AddMember("name", "qfl", allocator); //添加字符串值
jsonDoc.AddMember("age", 20, allocator); //添加int类型值
//生成array
rapidjson::Value letterArray(rapidjson::kArrayType);//创建一个Array类型的元素
letterArray.PushBack("a", allocator);
letterArray.PushBack("b", allocator);
letterArray.PushBack("c", allocator);
jsonDoc.AddMember("letter", letterArray, allocator); //添加数组
//生成一个object
rapidjson::Value locationObj(rapidjson::kObjectType);//创建一个Object类型的元素
locationObj.AddMember("province", "fujian", allocator);
locationObj.AddMember("city", "xiamen", allocator);
locationObj.AddMember("number", 16, allocator);
jsonDoc.AddMember("location", locationObj, allocator); //添加object到Document中
//生成一个object数组
rapidjson::Value bookArray(rapidjson::kArrayType);//生成一个Array类型的元素,用来存放Object
rapidjson::Value book1(rapidjson::kObjectType); //生成book1
book1.AddMember("name", "book1", allocator);
book1.AddMember("isbn", "123", allocator);
bookArray.PushBack(book1, allocator); //添加到数组
rapidjson::Value book2(rapidjson::kObjectType); //生成book2
book2.AddMember("name", "book2", allocator);
book2.AddMember("isbn", "456", allocator);
bookArray.PushBack(book2, allocator); //添加到数组
jsonDoc.AddMember("book", bookArray, allocator);
//添加属性
jsonDoc.AddMember("healthy", true, allocator); //添加bool类型值
// jsonDoc.AddMember("sports", NULL, allocator);//添加空值,这里会导致报错
//生成字符串
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
jsonDoc.Accept(writer);
std::string strJson = buffer.GetString();
log("-----生成的Json:\n%s", strJson.c_str());
//写到文件
std::string strPath = FileUtils::getInstance()->getWritablePath() + "JsonFile.txt";
FILE* myFile = fopen(strPath.c_str(), "w"); //windows平台要使用wb
if (myFile) {
fputs(buffer.GetString(), myFile);
fclose(myFile);
}
//JsonFile.txt文件内容
//{"name":"qfl","age":20,"letter":["a","b","c"],"location":{"province":"fujian","city":"xiamen","number":16},"book":[{"name":"book1","isbn":"123"},{"name":"book2","isbn":"456"}],"healthy":true}
log("-----读取Json内容:");
//从文件中读取(注意和上面分开,不能确定文件是否生成完毕,这里读取可能有问题)
rapidjson::Document newDoc;
myFile = fopen(strPath.c_str(), "r"); //windows平台使用rb
if (myFile) {
rapidjson::FileStream inputStream(myFile); //创建一个输入流
newDoc.ParseStream<0>(inputStream); //将读取的内容转换为dom元素
fclose(myFile); //关闭文件,很重要
}
//判断解析从流中读取的字符串是否有错误
if (newDoc.HasParseError()) {
log("Json Parse error:%d", newDoc.GetParseError()); //打印错误编号
}
else {
//获取json串中的数据
//先判断是否有这个字段,如果使用不存在的key去取值会导致直接崩溃
if (newDoc.HasMember("name")) {
log("name:%s", newDoc["name"].GetString()); //必须要获取对应的数据类型,rapidjson不会帮你转换类型
}
else {}
if (newDoc.HasMember("age")) {
log("age:%d", newDoc["age"].GetInt()); //获取正确的类型
}
else {}
if (newDoc.HasMember("letter")) {
rapidjson::Value letter; //使用一个新的rapidjson::Value来存放array的内容
letter = newDoc["letter"];
//确保它是一个Array,而且有内容
if (letter.IsArray() && !letter.Empty()) {
//遍历Array中的内容
for (rapidjson::SizeType i = 0; i < letter.Size(); i++) {
log("letter:%s", letter[i].GetString());
}
}
else {}
}
else {}
if (newDoc.HasMember("location")) {
rapidjson::Value location; //使用一个新的rapidjson::Value来存放object
location = newDoc["location"];
//确保它是一个Object
if (location.IsObject()) {
if (location.HasMember("province")) {
log("location:province:%s", location["province"].GetString());
}
else {}
if (location.HasMember("city")) {
log("location:city:%s", location["city"].GetString());
}
else {}
if (location.HasMember("number")) {
log("location:number:%d", location["number"].GetInt());
}
else {}
}
else {}
}
else {}
//book是一个包含了2个object的array。按照上面的步骤来取值就行
if (newDoc.HasMember("book")) {
rapidjson::Value book;
book = newDoc["book"];
//先取Array
if (book.IsArray() && !book.Empty()) {
rapidjson::Value tempBook;
for (rapidjson::SizeType i = 0; i < book.Size(); i++) {
tempBook = book[i]; //Array中每个元素又是一个Object
if (tempBook.IsObject()) {
if (tempBook.HasMember("name") && tempBook.HasMember("isbn")) {
log("book:%d:name:%s, isbn:%s", i, tempBook["name"].GetString(), tempBook["isbn"].GetString());
}
else {}
}
else {}
}
}
else {}
}
else {}
if (newDoc.HasMember("healthy")) {
if (newDoc["healthy"].GetBool()) {
log("healthy:true");
}
else {
log("healthy:false");
}
}
else {}
}
}
Rapidjson的简单使用示例的更多相关文章
- 【java开发系列】—— spring简单入门示例
1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- hadoop环境安装及简单Map-Reduce示例
说明:这篇博客来自我的csdn博客,http://blog.csdn.net/lxxgreat/article/details/7753511 一.参考书:<hadoop权威指南--第二版(中文 ...
- EasyHook远注简单监控示例 z
http://www.csdn 123.com/html/itweb/20130827/83559_83558_83544.htm 免费开源库EasyHook(inline hook),下面是下载地址 ...
- Web Service简单入门示例
Web Service简单入门示例 我们一般实现Web Service的方法有非常多种.当中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决 ...
- Ext简单demo示例
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- GDAL中MEM格式的简单使用示例
GDAL库中提供了一种内存文件格式--MEM.如何使用MEM文件格式,主要有两种,一种是通过别的文件使用CreateCopy方法来创建一个MEM:另外一种是图像数据都已经存储在内存中了,然后使用内存数 ...
- html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
这篇文章主要介绍了html5本地存储的localstorage .本地数据库.sessionStorage简单使用示例,需要的朋友可以参考下 html5的一个非常cool的功能,就是web stora ...
- hydra简单使用示例
本内容为网上收集整理,仅作为备忘!! hydra简单使用示例: 破解https: # hydra -m /index.php -l muts -P pass.txt 10.36.16.18 https ...
随机推荐
- LAMP环境搭建备忘 -- Apache、pHp 安装 (二)
上一篇 Linux 已经安装好了,我们选择了 CentOS 7 的最小化安装,即没有图形界面,并且我们在安装时设置了网络连接即能够连上外部网络,还设置了 root 密码.下面我们要在此基础上继续安装 ...
- docker安装MySQL8,目录挂载、配置用户名密码、忽略表名大小写、连接数、特殊字符、时区
原文:docker安装MySQL8,目录挂载.配置用户名密码.忽略表名大小写.连接数.特殊字符.时区 一.环境配置 1.系统:centos7.3 2.docker版本:Docker version 1 ...
- iOS基础UI控件介绍-Swift版
iOS基础UI控件总结 iOS基础控件包括以下几类: 1.继承自NSObject:(暂列为控件) UIColor //颜色 UIImage //图像 2.继承自UIView: 只能相应手势UIGest ...
- vue2.0移动端自定义性别选择提示框
这篇文章主要是简单的实现了vue2.0移动端自定义性别选择的功能,很简单但是经常用到,于是写了一个小小的demo,记录下来. 效果图: 实现代码: <template> <div c ...
- linux进程管理之轻量级进程(四)
在Linux中,轻量级进程可以是进程,也可以是线程.我们所说的线程,在Linux中,其实是轻量级进程之间共享代码段,文件描述符,信号处理,全局变量时: 如果不共享,就是我们所说的进程. 进程是资源管理 ...
- 【Henu ACM Round#24 A】k-String
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果是一个k-string的话. 考虑最后的串假设形式为sss..ss(k个s) 则s中出现的字母,整个串中最后出现的次数肯定为k的 ...
- 【转】C# 正则表达式大全
[转]C# 正则表达式大全 前言 在网上看到一个不错的简易版正则匹配和替换的工具,现在补充进来,感觉还不错,效果如下(输入验证中文汉字的正则表达式) 在线下载 密码:5tpt 注:好像也是一位园友 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 处理开发者需求
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 处理开发者需求 SharePoint本质上是一个平台.你 ...
- 小贝_redis list类型学习
redis list类型 一.查看list类型的命令 二.list命令具体解释 一.查看list类型的命令 1.在终端数据 help @list 127.0.0.1:6379>help @li ...
- 使用NiftyModeEffects对话框
最近看到一篇有关个性对话框的文章,里面介绍了非常酷的动画效果,开源的项目下载来试试,用法很简单. NoftyDialogEffects效果参考: http://tympanus.net/D ...