rapidjson使用总结

rapidjson简介

rapidjson是腾讯的开源json解析框架,用c++实现。由于全部代码仅用header file实现,所以很容易集成到项目中。

rapidjson的性能是很出色的,其作者Milo Yipz做了28个C/C++ JSON库的评测,这个链接里有测试的结果截图。

rapidjson的另一个特点是对json的标准符合程度是100%的(在开启了full precision选项的情况下)。

这里是官方教程:rapidjson官方教程

这里是原作者对rapidjson代码的剖析:rapidjson代码剖析

我之前的项目使用的是jsoncpp,最近在把解析json的代码交叉编译到iOS设备的时候,偶尔会出现crash的情况。虽然经过检查是代码写的有问题,不是jsoncpp的问题,在解决问题过程中尝试了rapidjson这个库,并顺便对比了一下jsoncpp和rapidjson对我项目中json文件的解析速度。

Dom解析示例

下面是我写的一个小例子,从test.json文件中读取内容并解析。其他代码示例也可以查看我的github仓库中关于rapidjson的测试代码:rapid_json_test.cpp.


Cocos2d-x 3.0 加入了rapidjson库用于json解析。位于项目的cocos2d/external/json下。

rapidjson 是一个不需要包含 .lib 和 .dll 即可运行的可见代码库。项目 wiki 见这里。下面通过两个实例来深入了解它在 cocos2dx 中的用法

注:cclOG() 函数需要在 DEBUG 模式下才有作用。

生成JSON文件并保存

  1. #include"CCStdC.h"
  2. #include"cocos2d.h"
  3. #include"json/document.h"
  4. #include"json/writer.h"
  5. #include"json/stringbuffer.h"
  6. usingnamespacerapidjson;
  7. USING_NS_CC;
  8. intmain()
  9. {
  10. //***生成json文件,存储在getWritablePath文件夹下***
  11. rapidjson::Documentwritedoc;
  12. writedoc.Setobject();
  13. rapidjson::Document::AllocatorType&allocator=writedoc.GetAllocator();
  14. rapidjson::Valuearray(rapidjson::kArrayType);
  15. rapidjson::Valueobject(rapidjson::kObjectType);
  16. //jsonobject格式添加名称/值”对
  17. object.AddMember("inttag",1,allocator);
  18. object.AddMember("doubletag",1.0,allocator);
  19. object.AddMember("booltag",true,153); border-image: initial; list-style: decimal-leading-zero outside; color: inherit; line-height: 18px; padding: 0px 3px 0px 10px !important;">object.AddMember("hellotag","helloworld",0); background-color: inherit;">//json加入数组
  20. array.PushBack(object,allocator);
  21. //jsonobject格式添加名称/值”对
  22. writedoc.AddMember("json","jsonstring",85); line-height: 18px; padding: 0px 3px 0px 10px !important;">writedoc.AddMember("array",array,85); line-height: 18px; padding: 0px 3px 0px 10px !important;">StringBufferbuffer;
  23. rapidjson::Writer<StringBuffer>writer(buffer);
  24. writedoc.Accept(writer);
  25. autopath=FileUtils::getInstance()->getWritablePath();
  26. path.append("myhero.json");
  27. FILE*file=fopen(path.c_str(),"wb");
  28. if(file)
  29. {
  30. fputs(buffer.GetString(),file);
  31. fclose(file);
  32. }
  33. cclOG("%s",buffer.GetString());
  34. return0;
  35. }


我是用 VS2012 编译的,最终生成的json文件位于 \proj.win32\Debug.win32 文件夹下。打开内容如下:

{"json":"json string","array":[{"inttag":1,"doubletag":1,"booltag":true,"hellotag":"helloworld"}]}

读取JSON文件显示

rapidjson 需要根据原 json 格式单独编写解析方法,因此根据以上生成方法,解析方法应该为:

  1. #include"CCStdC.h"
  2. #include"cocos2d.h"
  3. #include"json/document.h"
  4. #include"json/writer.h"
  5. #include"json/stringbuffer.h"
  6. usingnamespacerapidjson;
  7. USING_NS_CC;
  8. intmain()
  9. {
  10. autopath=FileUtils::getInstance()->getWritablePath();
  11. path.append("myhero.json");
  12. //***读取json文件***
  13. rapidjson::Documentreaddoc;
  14. boolbRet=false;
  15. ssize_tsize=0;
  16. std::stringload_str;
  17. //getFileData如果不指定,读取根目录是Resource文件
  18. unsignedchar*titlech=FileUtils::getInstance()->getFileData(path,"r",&size);
  19. load_str=std::string((constchar*)titlech,size);
  20. //load_str=cocos2d::FileUtils::getInstance()->getStringFromFile("..\\myhero.json");
  21. readdoc.Parse<0>(load_str.c_str());
  22. if(readdoc.HasParseError())
  23. {
  24. cclOG("GetParseError%s\n",readdoc.GetParseError());
  25. }
  26. if(!readdoc.IsObject())
  27. return0;
  28. rapidjson::Value&_json=readdoc["json"];
  29. constchar*ch=_json.GetString();
  30. cocos2d::log(ch);
  31. cocos2d::log(_json.GetString());
  32. rapidjson::Value&_array=readdoc["array"];
  33. if(_array.IsArray())
  34. cclOG("test");
  35. for(inti=0;i<_array.Capacity();i++)
  36. //cclOG("%d",i);
  37. rapidjson::Value&arraydoc=_array[i];
  38. if(arraydoc.HasMember("inttag"))
  39. int_inttag=arraydoc["inttag"].GetInt();
  40. cclOG("%d",_inttag);
  41. if(arraydoc.HasMember("doubletag"))
  42. double_doubletag=arraydoc["doubletag"].GetDouble();
  43. cclOG("%lf",_doubletag);
  44. }
  45. if(arraydoc.HasMember("booltag"))
  46. bool_booltag=arraydoc["booltag"].GetBool();
  47. ottom: none; border-left: 3px solid rgb(153,_booltag);
  48. if(arraydoc.HasMember("hellotag"))
  49. constchar*_hellotag=arraydoc["hellotag"].GetString();
  50. ottom: none; border-left: 3px solid rgb(153,_hellotag);
  51. }
cclOG 的最终显示为:

json stringjson stringtest11.0000001helloworld

相关文章

AJAX是一种基于JavaScript和XML的技术,能够使网页实现异步交...
在网页开发中,我们常常需要通过Ajax从后端获取数据并在页面...
在前端开发中,经常需要循环JSON对象数组进行数据操作。使用...
AJAX(Asynchronous JavaScript and XML)是一种用于创建 We...
AJAX技术被广泛应用于现代Web开发,它可以在无需重新加载页面...
Ajax是一种通过JavaScript和HTTP请求交互的技术,可以实现无...