ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Cpp中使用RapidJSON

2020-11-14 16:04:04  阅读:279  来源: 互联网

标签:cities name writer RapidJSON Key 使用 Cpp include rapidjson


简介

官方参考文档:http://rapidjson.org/zh-cn/index.html

RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库。RapidJSON是跨平台的,支持Windows, Linux, Mac OS X及iOS, Android。它的源码在https://github.com/Tencent/rapidjson/

解析JSON

简单例子

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>

using namespace rapidjson;

int main() {
    // 1. 把 JSON 解析至 DOM。
    const char* json = "{\"project\":\"rapidjson工程\",\"stars\":10}";
    Document d;
    d.Parse(json);

    // 2. 利用 DOM 作出修改。
    Value& s = d["stars"];
    s.SetInt(s.GetInt() + 1);

    // 3. 把 DOM 转换(stringify)成 JSON。
    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    d.Accept(writer);

    std::string sJson = buffer.GetString();
    std::cout << sJson.c_str() << std::endl;
    return 0;
}
View Code

 

复杂点的例子,基于Dom

#include <iostream>
#include <string>
#include "rapidjson/document.h"

/*
{
  "country": "中国",
  "province": [
    {
      "name": "黑龙江",
      "cities": ["哈尔滨","大庆"]
    },
    {
      "name": "广东",
      "cities": ["广州","深圳","珠海"]
    },
    {
      "name": "台湾",
      "cities": ["台北","高雄"]
    },
    {
      "name": "新疆",
      "cities": ["乌鲁木齐"]
    }
  ]
}
*/
int _tmain(int argc, _TCHAR* argv[])
{
    const char* str = "{\"country\":\"中国\",\"province\":[{\"name\":\"黑龙江\",\"cities\":[\"哈尔滨\",\"大庆\"]},{\"name\":\"广东\",\"cities\":[\"广州\",\"深圳\",\"珠海\"]},{\"name\":\"台湾\",\"cities\":[\"台北\",\"高雄\"]},{\"name\":\"新疆\",\"cities\":[\"乌鲁木齐\"]}]}";
    rapidjson::Document document;
    document.Parse(str);
    assert(document.IsObject());
    std::string s = document["country"].GetString();
    
    const rapidjson::Value& a = document["province"];
    assert(a.IsArray());
    for (rapidjson::SizeType i = 0; i < a.Size(); i++) // 使用 SizeType 而不是 size_t
    {
        const rapidjson::Value& b = a[i];
        assert(b.IsObject());
        std::string provinceName = b["name"].GetString();
        std::cout << provinceName << ": ";
        const rapidjson::Value& c = b["cities"];
        assert(c.IsArray());
        for (rapidjson::SizeType i = 0; i < c.Size(); i++)
        {
            std::string cityName = c[i].GetString();
            std::cout << cityName << " ";
        }
        std::cout << "\n";
    }
    return 0;
}
View Code

基于SAX的解析例子

#include "rapidjson/reader.h"
#include <iostream>
#include <sstream>

using namespace rapidjson;
using namespace std;

// If you can require C++11, you could use std::to_string here
template <typename T> std::string stringify(T x) {
    std::stringstream ss;
    ss << x;
    return ss.str();
}

struct MyHandler {
    std::string type;
    std::string data;

    MyHandler() : type(), data() {}

    bool Null() { type = "Null"; data.clear(); return true; }
    bool Bool(bool b) { type = "Bool:"; data = b ? "true" : "false"; return true; }
    bool Int(int i) { type = "Int:"; data = stringify(i); return true; }
    bool Uint(unsigned u) { type = "Uint:"; data = stringify(u); return true; }
    bool Int64(int64_t i) { type = "Int64:"; data = stringify(i); return true; }
    bool Uint64(uint64_t u) { type = "Uint64:"; data = stringify(u); return true; }
    bool Double(double d) { type = "Double:"; data = stringify(d); return true; }
    bool RawNumber(const char* str, SizeType length, bool) { type = "Number:"; data = std::string(str, length); return true; }
    bool String(const char* str, SizeType length, bool) { type = "String:"; data = std::string(str, length); return true; }
    bool StartObject() { type = "StartObject"; data.clear(); return true; }
    bool Key(const char* str, SizeType length, bool) { type = "Key:"; data = std::string(str, length); return true; }
    bool EndObject(SizeType memberCount) { type = "EndObject:"; data = stringify(memberCount); return true; }
    bool StartArray() { type = "StartArray"; data.clear(); return true; }
    bool EndArray(SizeType elementCount) { type = "EndArray:"; data = stringify(elementCount); return true; }
private:
    MyHandler(const MyHandler& noCopyConstruction);
    MyHandler& operator=(const MyHandler& noAssignment);
};

// 从Json中根据key返回value,(只是简单的key-value,value不支持Object/Array)
std::string GetValueByKeyFromJson(const char* json, const std::string& key)
{
    std::string sRet;
    MyHandler handler;
    rapidjson::Reader reader;
    rapidjson::StringStream ss(json);
    reader.IterativeParseInit();
    while (!reader.IterativeParseComplete())
    {
        reader.IterativeParseNext<kParseDefaultFlags>(ss, handler);
        if ("Key:" == handler.type)
        {
            if (key == handler.data)
            {
                reader.IterativeParseNext<kParseDefaultFlags>(ss, handler);
                sRet = handler.data;
                break;
            }
        }
    }
    return sRet;
}

int main() {
    const char json[] = " { \"你好\" : \"中国\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1415926, \"a\":[1, 2, 3, 4] } ";

    std::string s = GetValueByKeyFromJson(json, "你好");//"中国"
    s = GetValueByKeyFromJson(json, "pi");//"3.14159" --> 注意不是 3.1415926
    s = GetValueByKeyFromJson(json, "n");//""
    s = GetValueByKeyFromJson(json, "a");//""
    s = GetValueByKeyFromJson(json, "t");//"true"
    s = GetValueByKeyFromJson(json, "i");//"123"
    return 0;
}
View Code

 

生成Json

////////////// 生成JSON //////////////
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    rapidjson::StringBuffer buf;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buf);
    //rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buf); // it can word wrap

    writer.StartObject();               // Between StartObject()/EndObject(),
/*    writer.Key("hello");                // output a key,
    writer.String("world");             // follow by a value.
    writer.Key("t");
    writer.Bool(true);
    writer.Key("f");
    writer.Bool(false);
    writer.Key("n");
    writer.Null();
    writer.Key("i");
    writer.Uint(123);
    writer.Key("pi");
    writer.Double(3.1416);
    writer.Key("a");
    writer.StartArray();                // Between StartArray()/EndArray(),
    for (unsigned i = 0; i < 4; i++)
        writer.Uint(i);                 // all values are elements of the array.
    writer.EndArray();
    writer.EndObject();
    // {"hello":"world","t":true,"f":false,"n":null,"i":123,"pi":3.1416,"a":[0,1,2,3]}
    */
    
    writer.Key("country"); writer.String("中国");
    writer.Key("province");
    writer.StartArray();
    writer.StartObject();
    writer.Key("name"); writer.String("黑龙江");
    writer.Key("cities"); writer.StartArray(); writer.String("哈尔滨"); writer.String("大庆"); writer.EndArray();
    writer.EndObject();
    writer.StartObject();
    writer.Key("name"); writer.String("广东");
    writer.Key("cities"); writer.StartArray(); writer.String("广州"); writer.String("深圳"); writer.String("珠海"); writer.EndArray();
    writer.EndObject();
    writer.EndArray();

    writer.EndObject();

    const char* s = buf.GetString();//"{"country":"中国","province":[{"name":"黑龙江","cities":["哈尔滨","大庆"]},{"name":"广东","cities":["广州","深圳","珠海"]}]}"
    std::cout << s << "\n";
    return 0;
}
View Code

 

标签:cities,name,writer,RapidJSON,Key,使用,Cpp,include,rapidjson
来源: https://www.cnblogs.com/htj10/p/13973517.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有