C++ rapidjson使用示例

rapidjson使用示例


如果想深入学习rapidjson工具, 官方文档肯定是必须看一看的

本示例所用环境

引擎版本:cocos2d-x 3.10

示例代码与注释

说明:我是直接使用原本引擎创建了新的cocos2dx工程,然后略微修改了HelloWorldScene.cpp中的代码。为了方便,使用rapidjson生成json串,保存json串到文件,从文件读取json串,使用rapidjson解析json串的过程,全部写到了initSelf()函数中。

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 "HeeloWorldScene.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":"king",
// "age":20,
// "letter":["a","b","c"],
// "location": {"province":"shannxi","city":"xian","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","king",allocator); // 添加字符串值
	jsonDoc.AddMember("age",20,allocator); // 添加int类型值

	// 生成array
	rapidjso::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","shannxi",allocator);
	locationObj.AddMember("city","xian",allocator);
	locationObj.AddMember("number",16,allocator);
	jsonDoc.AddMember("location",locationObj,allocator);

	// 生成一个Object数组
	rapidjson::Value bookArray(rapidjson::kArrayType); // 定义数组(存放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类型值

	// 生成字符串
	rapidjson::StringBuffer buffer;
	rapidjson::Write<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* fp = fopen(strPath.c_str(),"wb");
	if (fp)
		fputs(buffer.GetString(),fp);
	fclose(fp);	
	//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;
	fp = fopen(strPath.c_str(),"rb");
	if (fp)
	{
		rapidjson::FileStream inputStream(fp); // 从文件中创建一个输入流
		newDoc.ParseStream<0>(inputStream); // 将读取的内容转换为dom元素
		fclose(fp);
	}
	//判断解析从流中读取的字符串是否有错误
    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 {}
    }
}

猜你喜欢

转载自blog.csdn.net/gaoyz1/article/details/84887724