Rapidjson的简单使用示例

前端之家收集整理的这篇文章主要介绍了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();
        true;
    }
}

//重点
void HelloWorld::initSelf()
{
//生成一串如下的json格式字符串,并解析
// {
// "name":"qfl",
// "age":20,128); background:transparent">// "letter":["a","b","c"],128); background:transparent">// "location": {"province":"fujian","city":"xiamen","number":16}
// "book":[{"name":"book1","isbn":"123"},{"name":"book2","isbn":"456"}],128); background:transparent">// "healthy":true,128); background:transparent">// }

    //生成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",97); background:transparent">"c",allocator);
    jsonDoc.AddMember("letter",letterArray,128); background:transparent">//添加数组

    //生成一个object
    rapidjson::Value locationObj(rapidjson::kObjectType);//创建一个Object类型的元素
    locationObj.AddMember("province",97); background:transparent">"fujian",allocator);
    locationObj.AddMember("city",97); background:transparent">"xiamen",97); background:transparent">"number",112); background:transparent">16,97); background:transparent">"location",locationObj,allocator);  //添加object到Document中

    //生成一个object数组
    rapidjson::Value bookArray//生成一个Array类型的元素,用来存放Object
    rapidjson::Value book1(rapidjson::kObjectType); //生成book1
    book1.AddMember("book1",allocator);
    book1.AddMember("isbn",97); background:transparent">"123",allocator);
    bookArray.PushBack(book1,allocator);           //添加到数组

    rapidjson::Value book2//生成book2
    book2.AddMember("book2",allocator);
    book2.AddMember("456",allocator);
    bookArray.PushBack(book2,128); background:transparent">//添加到数组
    jsonDoc.AddMember("book",bookArray,allocator);

    "healthy",true,128); background:transparent">//添加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());

    //写到文件
    string strPath = FileUtils::getInstance()->getWritablePath() + "JsonFile.txt";
    FILE* myFile = fopen(strPath.c_str(),97); background:transparent">"w");  //windows平台要使用wb
    if (myFile) {
        fputs(buffer.GetString(),myFile);
        fclose(myFile);
    }

    //JsonFile.txt文件内容
    //{"name":"qfl","age":20,"letter":["a","location":{"province":"fujian","number":16},"book":[{"name":"book1","healthy":true}

    "-----读取Json内容:");
    //从文件中读取(注意和上面分开,不能确定文件是否生成完毕,这里读取可能有问题)
    rapidjson::Document newDoc;
    myFile = fopen(strPath.c_str(),97); background:transparent">"r");   //windows平台使用rb
    if (myFile) {
        rapidjson::FileStream inputStream(myFile);  //创建一个输入流
        newDoc.ParseStream<0>(inputStream); //将读取的内容转换为dom元素
        fclose(myFile); //关闭文件,很重要
    }
    //判断解析从流中读取的字符串是否有错误
    if (newDoc.HasParseError()) {
        "Json Parse error:%d",newDoc.GetParseError()); //打印错误编号
    }
    else {
        //获取json串中的数据
        //先判断是否有这个字段,如果使用不存在的key去取值会导致直接崩溃
        if (newDoc.HasMember("name")) {
            "name:%s",newDoc["name"].GetString()); //必须要获取对应的数据类型,rapidjson不会帮你转换类型
        }
        else {}

        "age")) {
            "age:%d",97); background:transparent">"age"].GetInt());  //获取正确的类型
        }
        "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++) {
                    "letter:%s",letter[i].GetString());
                }
            }
            else {}
        }
        "location")) {
            rapidjson::Value location;      //使用一个新的rapidjson::Value来存放object
            location = newDoc["location"];

            //确保它是一个Object
            if (location.IsObject()) {

                if (location.HasMember("province")) {
                    "location:province:%s",location["province"].GetString());
                }
                else {}
                "city")) {
                    "location:city:%s",97); background:transparent">"city"].GetString());
                }
                "number")) {
                    "location:number:%d",97); background:transparent">"number"].GetInt());
                }
                else {}
            }
            else {}

        //book是一个包含了2个object的array。按照上面的步骤来取值就行
        "book")) {
            rapidjson::Value book;
            book = newDoc["book"];

            //先取Array
            if (book.IsArray() && !book.Empty()) {

                rapidjson::Value tempBook;
                0; i < book.Size(); i++) {
                    tempBook = book[i]; //Array中每个元素又是一个Object

                    if (tempBook.IsObject()) {

                        if (tempBook.HasMember("name") && tempBook.HasMember("isbn")) {
                            "book:%d:name:%s,isbn:%s",i,tempBook["name"].GetString(),97); background:transparent">"isbn"].GetString());
                        }
                        else {}
                    }
                    else {}
                }
            }
            "healthy")) {
            if (newDoc["healthy"].GetBool()) {
                "healthy:true");
            }
            else {
                "healthy:false");
            }
        }
        else {}
    }
}
原文链接:https://www.f2er.com/json/288899.html

猜你在找的Json相关文章