很早就想用用Markdown了,一直没机会。今天就来试一下
先放个目录:
rapidjson官方教程
如果要想深入学习rapidjson工具,官方文档肯定是必须看一看的。官方教程里面的讲解才是最详细,最权威的了。
本示例所用环境
- 引擎版本:cocos2d-x 3.10@H_404_39@
示例代码与注释
说明:我是直接使用原版引擎创建了新的cocos2dx工程,然后略微修改了HelloWorldScene.cpp中的代码。为了方便,使用rapidjson生成json串、保存json串到文件、从文件读取json串、使用rapidjson解析json串的过程,全部写到了initSelf()函数中。
本身很反感blog全篇粘代码的方式(关键贴的代码谁都看不懂,一行注释没有),但是这部分代码示例没有什么可说的,所以在重点部分写了注释。
HelloWorldScene.h文件内容@H_404_39@
#include@H_404_39@ "cocos2d.h"@H_404_39@
class@H_404_39@ HelloWorld : public@H_404_39@ cocos2d::Layer
{
public@H_404_39@:
static@H_404_39@ cocos2d::Scene* createScene@H_404_39@();
virtual@H_404_39@ @H_404_39@bool@H_404_39@ init@H_404_39@()@H_404_39@@H_404_39@;
CREATE_FUNC(HelloWorld);
private@H_404_39@:
void@H_404_39@ @H_404_39@initSelf@H_404_39@()@H_404_39@@H_404_39@;
};
HelloWorldScene.cpp文件内容@H_404_39@
include@H_404_39@ "HelloWorldScene.h"@H_404_39@
include@H_404_39@ "json/rapidjson.h"@H_404_39@
include@H_404_39@ "json/document.h"@H_404_39@
include@H_404_39@ "json/filestream.h"@H_404_39@
include@H_404_39@ "json/stringbuffer.h"@H_404_39@
include@H_404_39@ "json/writer.h"@H_404_39@
USING_NS_CC;
Scene* HelloWorld::createScene()
{
auto@H_404_39@ scene = Scene::create();
auto@H_404_39@ layer = HelloWorld::create();
scene->addChild(layer);
return@H_404_39@ scene;
}
bool@H_404_39@ HelloWorld::init()
{
if@H_404_39@ ( !Layer::init() )
{
return@H_404_39@ false@H_404_39@;
}
else@H_404_39@ {
this@H_404_39@->initSelf();
true@H_404_39@;
}
}
//重点@H_404_39@
void@H_404_39@ HelloWorld::initSelf()
{
//生成一串如下的json格式字符串,并解析@H_404_39@
// {@H_404_39@
// "name":"qfl",@H_404_39@
// "age":20,128); background:transparent">// "letter":["a","b","c"],128); background:transparent">// "location": {"province":"fujian","city":"xiamen","number":16}@H_404_39@
// "book":[{"name":"book1","isbn":"123"},{"name":"book2","isbn":"456"}],128); background:transparent">// "healthy":true,128); background:transparent">// }@H_404_39@
//生成Json串@H_404_39@
rapidjson::Document jsonDoc; //生成一个dom元素Document@H_404_39@
rapidjson::Document::AllocatorType &allocator = jsonDoc.GetAllocator(); //获取分配器@H_404_39@
jsonDoc.SetObject(); //将当前的Document设置为一个object,也就是说,整个Document是一个Object类型的dom元素@H_404_39@
//添加属性@H_404_39@
jsonDoc.AddMember("name"@H_404_39@,"qfl"@H_404_39@,allocator); //添加字符串值@H_404_39@
jsonDoc.AddMember("age"@H_404_39@,20@H_404_39@,allocator); //添加int类型值@H_404_39@
//生成array@H_404_39@
rapidjson::Value letterArray@H_404_39@(rapidjson::kArrayType)@H_404_39@@H_404_39@;//创建一个Array类型的元素@H_404_39@
letterArray.PushBack("a"@H_404_39@,allocator);
letterArray.PushBack("b"@H_404_39@,97); background:transparent">"c"@H_404_39@,allocator);
jsonDoc.AddMember("letter"@H_404_39@,letterArray,128); background:transparent">//添加数组@H_404_39@
//生成一个object@H_404_39@
rapidjson::Value locationObj@H_404_39@(rapidjson::kObjectType)@H_404_39@@H_404_39@;//创建一个Object类型的元素@H_404_39@
locationObj.AddMember("province"@H_404_39@,97); background:transparent">"fujian"@H_404_39@,allocator);
locationObj.AddMember("city"@H_404_39@,97); background:transparent">"xiamen"@H_404_39@,97); background:transparent">"number"@H_404_39@,112); background:transparent">16@H_404_39@,97); background:transparent">"location"@H_404_39@,locationObj,allocator); //添加object到Document中@H_404_39@
//生成一个object数组@H_404_39@
rapidjson::Value bookArray@H_404_39@//生成一个Array类型的元素,用来存放Object@H_404_39@
rapidjson::Value book1@H_404_39@(rapidjson::kObjectType)@H_404_39@@H_404_39@; //生成book1@H_404_39@
book1.AddMember("book1"@H_404_39@,allocator);
book1.AddMember("isbn"@H_404_39@,97); background:transparent">"123"@H_404_39@,allocator);
bookArray.PushBack(book1,allocator); //添加到数组@H_404_39@
rapidjson::Value book2@H_404_39@//生成book2@H_404_39@
book2.AddMember("book2"@H_404_39@,allocator);
book2.AddMember("456"@H_404_39@,allocator);
bookArray.PushBack(book2,128); background:transparent">//添加到数组@H_404_39@
jsonDoc.AddMember("book"@H_404_39@,bookArray,allocator);
"healthy"@H_404_39@,true@H_404_39@,128); background:transparent">//添加bool类型值@H_404_39@
// jsonDoc.AddMember("sports",NULL,allocator);//添加空值,这里会导致报错@H_404_39@
//生成字符串@H_404_39@
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
jsonDoc.Accept(writer);
std@H_404_39@::string@H_404_39@ strJson = buffer.GetString();
log@H_404_39@("-----生成的Json:\n%s"@H_404_39@,strJson.c_str());
//写到文件@H_404_39@
string@H_404_39@ strPath = FileUtils::getInstance()->getWritablePath() + "JsonFile.txt"@H_404_39@;
FILE* myFile = fopen(strPath.c_str(),97); background:transparent">"w"@H_404_39@); //windows平台要使用wb@H_404_39@
if@H_404_39@ (myFile) {
fputs@H_404_39@(buffer.GetString(),myFile);
fclose(myFile);
}
//JsonFile.txt文件内容@H_404_39@
//{"name":"qfl","age":20,"letter":["a","location":{"province":"fujian","number":16},"book":[{"name":"book1","healthy":true}@H_404_39@
"-----读取Json内容:"@H_404_39@);
//从文件中读取(注意和上面分开,不能确定文件是否生成完毕,这里读取可能有问题)@H_404_39@
rapidjson::Document newDoc;
myFile = fopen(strPath.c_str(),97); background:transparent">"r"@H_404_39@); //windows平台使用rb@H_404_39@
if@H_404_39@ (myFile) {
rapidjson::FileStream inputStream@H_404_39@(myFile)@H_404_39@@H_404_39@; //创建一个输入流@H_404_39@
newDoc.ParseStream<0@H_404_39@>(inputStream); //将读取的内容转换为dom元素@H_404_39@
fclose(myFile); //关闭文件,很重要@H_404_39@
}
//判断解析从流中读取的字符串是否有错误@H_404_39@
if@H_404_39@ (newDoc.HasParseError()) {
"Json Parse error:%d"@H_404_39@,newDoc.GetParseError()); //打印错误编号@H_404_39@
}
else@H_404_39@ {
//获取json串中的数据@H_404_39@
//先判断是否有这个字段,如果使用不存在的key去取值会导致直接崩溃@H_404_39@
if@H_404_39@ (newDoc.HasMember("name"@H_404_39@)) {
"name:%s"@H_404_39@,newDoc["name"@H_404_39@].GetString()); //必须要获取对应的数据类型,rapidjson不会帮你转换类型@H_404_39@
}
else@H_404_39@ {}
"age"@H_404_39@)) {
"age:%d"@H_404_39@,97); background:transparent">"age"@H_404_39@].GetInt()); //获取正确的类型@H_404_39@
}
"letter"@H_404_39@)) {
rapidjson::Value letter; //使用一个新的rapidjson::Value来存放array的内容@H_404_39@
letter = newDoc["letter"@H_404_39@];
//确保它是一个Array,而且有内容@H_404_39@
if@H_404_39@ (letter.IsArray() && !letter.Empty()) {
//遍历Array中的内容@H_404_39@
for@H_404_39@ (rapidjson::SizeType i = 0@H_404_39@; i < letter.Size(); i++) {
"letter:%s"@H_404_39@,letter[i].GetString());
}
}
else@H_404_39@ {}
}
"location"@H_404_39@)) {
rapidjson::Value location; //使用一个新的rapidjson::Value来存放object@H_404_39@
location = newDoc["location"@H_404_39@];
//确保它是一个Object@H_404_39@
if@H_404_39@ (location.IsObject()) {
if@H_404_39@ (location.HasMember("province"@H_404_39@)) {
"location:province:%s"@H_404_39@,location["province"@H_404_39@].GetString());
}
else@H_404_39@ {}
"city"@H_404_39@)) {
"location:city:%s"@H_404_39@,97); background:transparent">"city"@H_404_39@].GetString());
}
"number"@H_404_39@)) {
"location:number:%d"@H_404_39@,97); background:transparent">"number"@H_404_39@].GetInt());
}
else@H_404_39@ {}
}
else@H_404_39@ {}
//book是一个包含了2个object的array。按照上面的步骤来取值就行@H_404_39@
"book"@H_404_39@)) {
rapidjson::Value book;
book = newDoc["book"@H_404_39@];
//先取Array@H_404_39@
if@H_404_39@ (book.IsArray() && !book.Empty()) {
rapidjson::Value tempBook;
0@H_404_39@; i < book.Size(); i++) {
tempBook = book[i]; //Array中每个元素又是一个Object@H_404_39@
if@H_404_39@ (tempBook.IsObject()) {
if@H_404_39@ (tempBook.HasMember("name"@H_404_39@) && tempBook.HasMember("isbn"@H_404_39@)) {
"book:%d:name:%s,isbn:%s"@H_404_39@,i,tempBook["name"@H_404_39@].GetString(),97); background:transparent">"isbn"@H_404_39@].GetString());
}
else@H_404_39@ {}
}
else@H_404_39@ {}
}
}
"healthy"@H_404_39@)) {
if@H_404_39@ (newDoc["healthy"@H_404_39@].GetBool()) {
"healthy:true"@H_404_39@);
}
else@H_404_39@ {
"healthy:false"@H_404_39@);
}
}
else@H_404_39@ {}
}
}
原文链接:https://www.f2er.com/json/288899.html