Cocos2d-x 中 RapidJSON 小结

RapidJSON 是一个 C++ 的 JSON 解析器及生成器,具体相关信息可参考 RapidJSON 文档 ,在 Cocos2d-x 3.0 中加入了 rapidjson 库用于 json 解析,该库位于 external/json 下。

下面就来说说如何使用 rapidjson 来解析和生成 json 字符串:

1. 解析 json 字符串

使用 rapidjson 来解析下面的 json 字符串内容

"success": true, "code": 0, "result": { "order": { "title": "标题", "detail": "订单详情", "extends": "扩展内容", "time_start": "1518338445", "time_expire": "1518438445" "order_id": "20180211-108170"

引入头文件

 #include "json/rapidjson.h"
 #include "json/document.h"

json 解析

 std::string str_json = "{\"success\": true, \"code\": 0, \"result\": {\"order\": {\"title\": \"标题\", \"detail\": \"订单详情\", \"extends\": \"扩展内容\", \"time_start\": \"1518338445\", \"time_expire\": \"1518438445\"}, \"order_id\": \"20180211-108170\"}}";
 CCLOG("%s\n", str_json.c_str());
 rapidjson::Document document;
 document.Parse<0>(str_json.c_str());
 if (document.HasParseError()) { //打印解析错误
     CCLOG("GetParseError %s\n",document.GetParseError());
 if (document.IsObject()) {
     if (document.HasMember("success")) {
       CCLOG("%s\n", document["success"].GetBool()); //打印获取 success 的值
    if (document.HasMember("result") && document["result"].HasMember("order_id") ) {
      CCLOG("%s\n", document["result"]["order_id"].GetString()); //打印获取 order_id 的值

2. 生成 json 字符串

引入头文件

 #include "json/document.h"
 #include "json/writer.h"
 #include "json/stringbuffer.h"
 using namespace  rapidjson;

生成 json 内容

rapidjson::Document document; 
document.SetObject(); 
rapidjson::Document::AllocatorType& allocator = document.GetAllocator(); 
rapidjson::Value array(rapidjson::kArrayType); 
rapidjson::Value object(rapidjson::kObjectType); 
object.AddMember("int", 1, allocator); 
object.AddMember("double", 1.0, allocator); object.AddMember("bool", true, allocator); object.AddMember("hello", "你好", allocator); array.PushBack(object, allocator);
document.AddMember("json", "json string", allocator); document.AddMember("array", array, allocator);
StringBuffer buffer;
rapidjson::Writer<StringBuffer> writer(buffer);
document.Accept(writer);
CCLOG("%s",buffer.GetString());
 cocos2d: {"json":"json string","array":[{"int":1,"double":1,"bool":true,"hello":"你好"}]}

3. json解析+生成结合使用(适合快速提取 json 字符串中的某段内容)

比如从刚刚的内容中,获取 order 字段对应的 json 内容

原json内容:

"success": true, "code": 0, "result": { "order": { "title": "标题", "detail": "订单详情", "extends": "扩展内容", "time_start": "1518338445", "time_expire": "1518438445" "order_id": "20180211-108170"

需要提取的json内容:

"title": "标题", "detail": "订单详情", "extends": "扩展内容", "time_start": "1518338445", "time_expire": "1518438445"

思路:解析原有json字符串,获取到 order 字段对应的 object 后,再将内容生成到新的 json 字符串中:

 std::string responseStr = "{\"success\": true, \"code\": 0, \"result\": {\"order\": {\"title\": \"标题\", \"detail\": \"订单详情\", \"extends\": \"扩展内容\", \"time_start\": \"1518338445\", \"time_expire\": \"1518438445\"}, \"order_id\": \"20180211-108170\"}}"
 rapidjson::Document d;
    d.Parse<rapidjson::kParseDefaultFlags>(responseStr.c_str());
    if (d.HasParseError()) { //打印解析错误
        log("GetParseError %s", d.GetParseError());
    if (d.IsObject() && d.HasMember("result")) {
        if (d["result"].HasMember("order")) {
            rapidjson::Document doc;
            doc.Set(d["result"]["order"].GetObject(), doc.GetAllocator());
            rapidjson::StringBuffer sb;
            rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
            doc.Accept(writer);
            std::string order_info=sb.GetString();