推荐一款cpp解析json工具--rapidjson

来源:互联网 发布:淘宝上卖燕窝不让卖 编辑:程序博客网 时间:2024/06/07 00:18

项目地址:http://code.google.com/p/rapidjson/

上面有很详细的介绍:http://code.google.com/p/rapidjson/wiki/UserGuide

作者介绍说:" Rapidjsonis an attempt to create the fastest JSON parser and generator. "

这是一个试图创造出一个最快的json解析和生成项目 呵呵。

 

嘛也不说 通过一个例子来看看这个工具的好用之处。

[html] view plaincopyprint?
  1. #include "rapidjson/document.h" // rapidjson's DOM-style API  
  2. #include "rapidjson/prettywriter.h" // for stringify JSON  
  3. #include "rapidjson/filestream.h"       // wrapper of C stream for prettywriter as output  
  4. #include <cstdio>  
  5.   
  6. using namespace rapidjson;  
  7.   
  8. int main()  
  9. {       
  10.     char json[100] = "{ \"hello\" : \"world\" }";   
  11.     rapidjson::Document d;       
  12.     d.Parse<0>(json);        
  13.     printf("%s\n", d["hello"].GetString());      
  14.     printf("%s\n", json);      
  15.     getchar();  
  16.     return 0;   
  17. }  

 

输出:



下面说说这个开源程序的几个特点:

优点:

1.依赖库很少,

2.轻量级

3.对于Dom模型层级关系表述的很清楚

 

缺点:

1。只支持标准的json格式,一些非标准的json格式不支持

2。缺少一些比较通用的接口,再解析的时候需要自己再封装一层,否则代码量将会很大。

 

举个例子:

Json数据

{ "hello" : "world","t" : true , "f" : false, "n": null,"i":123, "pi": 3.1416, "a":[1, 2, 3, 4] }

 

为了获取a中第三个元素的值就得进行如下的操作:

[html] view plaincopyprint?
  1. int main()  
  2. {       
  3.     //char json[100] = "{ \"hello\" : \"world\" }";   
  4.       
  5.     const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } ";  
  6.   
  7.     rapidjson::Document d;       
  8.     d.Parse<0>(json);        
  9.     if (d.HasParseError())  
  10.     {  
  11.         printf("GetParseError %s\n",d.GetParseError());  
  12.     }  
  13.   
  14.     if (d.HasMember("a"))//这个时候要保证d湿IsObject类型 最好是 if(d.Isobject() && d.HasMember("a"))  
  15.     {  
  16.         const Value &a=d["a"];  
  17.         if (a.IsArray() && a.Size() > 3)  
  18.         {  
  19.             const Value &a3=a[2];  
  20.             string stra3;  
  21.             ValueToString(a3, stra3);  
  22.             if (a3.IsInt())  
  23.             {  
  24.                     printf("GetInt [%d] \n",a3.GetInt()); ;  
  25.             }  
  26.         }  
  27.     }  
  28.       
  29.     getchar();  
  30.     return 0;   
  31. }  

可以看到为了获取一个二级的数据需要进行一层层的解析和类型判断,否则程序就会崩溃。

这里注意的一点HasMember 也必须是Isobject才能调用否则程序也会调用失败。

建议可以封装出以下几个接口:

int ValueToString(const Value &node ,string &strRet);

int ValueToLong(const Value &node ,long &lRet);

int GetChildNode(const Value &Pnode,vector<string> &listCfg, Value &ChildNode ) ;

int GetChildNode(const Value &Pnode,const intiArrSize, char[][32] &szArrCfg, Value &ChildNode ) ;

之类的接口。


 源码下载

不对之处敬请谅解~~ 欢迎交流~~~微笑

原文地址:http://blog.csdn.net/zerolxl/article/details/8241595


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 教师被学生骂后怎么办 嘴吧里面长泡怎么办 有个小孩怕下雨怎么办? 幼儿的家长打我怎么办 老师打学生被家长起诉怎么办 家长在学校打了老师怎么办 老师打小孩我们家长怎么办呢? 孩子长手、腿毛怎么办 腿毛又黑又多怎么办 孩子怕老师说他怎么办 被老师骂到厌学怎么办 孩子对写作业一点也不主动怎么办 高三孩子太贪玩怎么办 玩心重的孩子该怎么办 儿子读大学不愿意读书怎么办 孩子打架全班都讨厌怎么办 孩子不爱学习怎么办 二年级 二年级孩子不爱学习总爱玩怎么办 初三孩子学习不积极怎么办 孩子学习不积极应该怎么办 小孩子贪玩不写作业怎么办 老公懒不帮忙分担家务怎么办 宝宝不喜欢早教课程单一怎么办 孩子上课不听话顶撞老师怎么办 孩子不喜欢吃水果蔬菜怎么办 中学生顶撞家长顶撞老师怎么办 .cn孩子初中上课不专心怎么办 娃儿小学二年级做不来怎么办 孩子不愿意看书沉迷电子产品怎么办 孩子自律和自控性差怎么办 婴儿7个月不喜欢吃东西怎么办 半岁宝宝太活泼怎么办 6个月宝宝太活泼怎么办 做nt宝宝太活跃怎么办 静不下心来学习怎么办 初中的孩子不爱学习怎么办 小孩不爱读书不做作业怎么办 母亲性格内向儿子也是内向怎么办 我儿子不爱吃怎么办啊 孩子练字就是记不住怎么办 孩子不愿意和小朋友玩怎么办