rapidjson实例

包含头文件

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/stringbuffer.h"

生成json字符串   

int main()
{
    rapidjson::Document doc; //获取Document对象
    doc.SetObject();    //key-value 相当与map;   doc.SetArray(); //数组型 相当与vector

            rapidjson::Document::AllocatorType &allocator=doc.GetAllocator(); //获取分配器

    doc.AddMember("name","名字",allocator);//给doc对象赋值

    //添加数组数据
    rapidjson::Value array(rapidjson::kArrayType);
    for(int i=0;i<3;i++)
    {
        rapidjson::Value arrsub(rapidjson::kArrayType);
        arrsub.PushBack(i, allocator);
        //arrsub.PushBack(rapidjson::Value("aa", allocator).Move(), allocator);
        arrsub.PushBack(rapidjson::Value("aa", std::strlen("aa"), allocator).Move(), allocator);
        arrsub.PushBack(i+1.0, allocator);

        array.PushBack(arrsub,allocator);
        if(arrsub.IsNull())
        {
            std::cout<<"arrsub转移了"<<std::endl;
        }
    }

    doc.AddMember("arr",array,allocator);
    if(array.IsNull())
    {
        std::cout<<"arr转移了"<<std::endl;
    }

    //将doc对象的值写入字符串
    rapidjson::StringBuffer buffer;
    rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);  //PrettyWriter是格式化的json
            doc.Accept(writer);
    std::cout<<buffer.GetString()<<std::endl;

    buffer.Clear();
    rapidjson::Writer<rapidjson::StringBuffer> writer2(buffer); //Writer则是换行空格压缩后的json
    doc.Accept(writer2);
    std::cout<<buffer.GetString()<<std::endl;

    return 0;
}

输出结果

arrsub转移了
arrsub转移了
arrsub转移了
arr转移了
{
    "name": "名字",
    "arr": [
        [
            0,
            "aa",
            1.0
        ],
        [
            1,
            "aa",
            2.0
        ],
        [
            2,
            "aa",
            3.0
        ]
    ]
}
{"name":"名字","arr":[[0,"aa",1.0],[1,"aa",2.0],[2,"aa",3.0]]}

解析json字符串

struct subarr
{
    std::string str;
    int i;
    double d;

    //在C++11中std中有stoi、stod、stof、stol和stoll等函数
    //分别是把字符串转化为int、double、float、long和long、long型。
    //而数字转字符串则用to_string
    std::string tostr()
    {
        std::string buf;
        buf.append(std::to_string(i)).append(",")
                .append(str).append(",")
                .append(std::to_string(d));
        return buf;
        }
};
typedef  std::shared_ptr<subarr> subarr_ptr;//shared_ptr要包含#include<memory>
typedef  std::shared_ptr<std::vector<subarr_ptr>> sh_subarr_ptr;


struct docobj
{
    std::string name;
    std::vector<subarr_ptr> arr;

    std::string tostr()
    {
        std::string buf;
        buf.append("{")
                .append("name:").append(name).append(",")
                .append("arr:").append("[");
        for(auto ptr:arr)
            {
            buf.append("[").append(ptr->tostr()).append("]");
            }

        buf.append("]")
                .append("}");
        return buf;
        }
};

int main()
{
    const char* json_str="{\"name\":\"名字\",\"arr\":[[0,\"aa\",1.0],[1,\"aa\",2.0],[2,\"aa\",3.0]]}";
    rapidjson::Document document;
    document.Parse(json_str);
    if(document.HasParseError())
    {
        return 0;
    }

    docobj obj;

    auto node_ptr = document.FindMember("name");
    if(document.MemberEnd()==node_ptr)
    {
        return 0;
    }
    const rapidjson::Value& node = node_ptr->value;
    if(node.IsString())
    {
        obj.name=node.GetString();
    }

    node_ptr = document.FindMember("arr");
    if(document.MemberEnd()==node_ptr || !node_ptr->value.IsArray())
    {
        return 0;
    }

    const rapidjson::Value& nodes = document["arr"];
    if(!nodes.IsArray())
    {
        return 0;
    }

    for(rapidjson::SizeType i = 0; i < nodes.Size(); ++i)
    {
        const rapidjson::Value& subnodes = nodes[i];
        if(!subnodes.IsArray() || 3!=subnodes.Size())
        {
            continue;
        }

        subarr_ptr ptr(new subarr_ptr::element_type());
        ptr->i=subnodes[0].GetInt();
        ptr->str=subnodes[1].GetString();
        ptr->d=subnodes[2].GetDouble();

        obj.arr.push_back(ptr);
    }

    std::cout << obj.tostr() << std::endl;

    return 0;
}

输出结果

{name:名字,arr:[[0,aa,1.000000][1,aa,2.000000][2,aa,3.000000]]}

浅拷贝与深拷贝

    rapidjson::Document doc;
    doc.SetObject();
    auto& allocator = doc.GetAllocator();

    char a[8]="aaaaa";

    rapidjson::Value node;
    node.SetArray();

    for(int i=0;i<1;i++)
    {
        rapidjson::Value node1(rapidjson::kArrayType);

        //浅拷贝
        node1.PushBack(rapidjson::StringRef(a), allocator);
        //深拷贝
        node1.PushBack(rapidjson::Value(a, allocator).Move(), allocator);

        node.PushBack(node1, allocator);
    }

    a[3]='b';

    doc.AddMember("data",node,allocator);

    rapidjson::StringBuffer sb;
    rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
    doc.Accept(writer);

    std::cout<<sb.GetString()<<std::endl;

输出结果:

{
    "data": [
        [
            "aaaba",
            "aaaaa"
        ]
    ]
}

猜你喜欢

转载自blog.csdn.net/f110300641/article/details/81974121