开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 8582|回复: 4
收起左侧

[图文教程] C++封装rapidjson来编解码json

[复制链接]

结帖率:33% (1/3)
发表于 2013-2-21 11:33:30 | 显示全部楼层 |阅读模式   上海市上海市
C++封装rapidjson,用来编解码json。需要rapidjson库
  1. 代码片段1:
  2. class JsonInterface
  3. {
  4.         friend class JsonStream<Doc_Allocator_T>;

  5. public:
  6.         virtual void        Serialize(std::string& out)
  7.         {
  8.                 String_Buf_T strbuf;
  9.                 Doc_Allocator_T        allocator;
  10.                 Writer_T writer(strbuf, &allocator);

  11.                 Json_Strm_T jstrm(&allocator);

  12.                 Json_Value_T        ret_obj(rapidjson::kObjectType);
  13.                 try
  14.                 {
  15.                         encode(jstrm, ret_obj);
  16.                 }
  17.                 catch(...)
  18.                 {
  19.                         out.clear();
  20.                         return;
  21.                 }
  22.                
  23.                 ret_obj.Accept(writer);

  24.                 out = strbuf.GetString();
  25.         }

  26.         virtual int32_t        UnSerialize(const std::string& in, std::string& error)//0 is success
  27.         {
  28.                 Document_T        document;
  29.                
  30.                 if (document.Parse<0>(in.c_str()).HasParseError())
  31.                 {
  32.                         error = "json obj has parse error";
  33.                         return JSON_PARSE_ERR;
  34.                 }

  35.                 Doc_Allocator_T        allocator;
  36.                 Json_Strm_T jstrm(&allocator);
  37.                 try
  38.                 {
  39.                         decode(jstrm, document);
  40.                 }
  41.                 catch(const JsonErr& err)
  42.                 {
  43.                         error = err;
  44.                         return JSON_DECODE_ERR;
  45.                 }
  46.                 return JSON_SUCCESS;
  47.         }

  48. protected:
  49.         virtual Json_Strm_T& encode(Json_Strm_T& strm, Json_Value_T& jobj) = 0;
  50.         virtual Json_Strm_T& decode(Json_Strm_T& strm, Json_Value_T& jobj) = 0;
  51. };

  52. 代码片段2:

  53. template<typename Allocator>
  54. void JsonStream<Allocator>::encode(const char* m_name, Json_Value_T& jobj, JsonInterface& t)
  55. {
  56.         Json_Value_T        t_obj(rapidjson::kObjectType);

  57.         t.encode(*this, t_obj);

  58.         if (jobj.IsObject())
  59.         {
  60.                 jobj.AddMember(m_name, t_obj, *allocator);
  61.         }
  62.         else
  63.                 throw JsonErr("encode error: jobj is not a obj, key is ") + m_name;
  64. }
复制代码
  1. #ifndef JSON_STREAM_H__
  2. #define JSON_STREAM_H__

  3. #include <string>
  4. #include <vector>
  5. #include "rapidjson/document.h"
  6. #include "rapidjson/writer.h"
  7. #include "rapidjson/stringbuffer.h"

  8. #include "base_typedef.h"

  9. #define BEGIN_JSON_NS namespace        JSON_NS{
  10. #define END_JSON_NS          }       

  11. BEGIN_JSON_NS

  12. #define JSON_SUCCESS        0
  13. #define JSON_PARSE_ERR        1
  14. #define JSON_DECODE_ERR        2

  15. typedef std::string        JsonErr;

  16. typedef rapidjson::SizeType                                                                                                        Json_Size_T;
  17. typedef rapidjson::Value                                                                                                        Json_Value_T;
  18. typedef rapidjson::Document                                                                                                        Document_T;
  19. typedef Document_T::AllocatorType                                                                                        Doc_Allocator_T;
  20. typedef rapidjson::StringBuffer                                                                                                String_Buf_T;
  21. typedef rapidjson::Writer<String_Buf_T, rapidjson::UTF8<>, Doc_Allocator_T>        Writer_T;

  22. class JsonInterface;

  23. template<typename Allocator>
  24. class JsonStream
  25. {
  26. public:
  27.         void encode(const char* m_name, Json_Value_T& jobj, JsonInterface& t);
  28.         void encode(const char* m_name, Json_Value_T& jobj, int32_t dest);
  29.         void encode(const char* m_name, Json_Value_T& jobj, uint32_t dest);
  30.         void encode(const char* m_name, Json_Value_T& jobj, int64_t dest);
  31.         void encode(const char* m_name, Json_Value_T& jobj, uint64_t dest);
  32.         void encode(const char* m_name, Json_Value_T& jobj, std::string& in);

  33.         template<typename T>
  34.         void encode(const char* m_name, Json_Value_T& jobj, std::vector<T>& list);

  35. public:
  36.         void decode(const char* m_name, Json_Value_T& jobj, JsonInterface& t);
  37.         void decode(const char* m_name, Json_Value_T& jobj, int32_t& dest);
  38.         void decode(const char* m_name, Json_Value_T& jobj, uint32_t& dest);
  39.         void decode(const char* m_name, Json_Value_T& jobj, int64_t& dest);
  40.         void decode(const char* m_name, Json_Value_T& jobj, uint64_t& dest);
  41.         void decode(const char* m_name, Json_Value_T& jobj, std::string& out);

  42.         template<typename T>
  43.         void decode(const char* m_name, Json_Value_T& jobj, std::vector<T>& list);

  44. public:
  45.         JsonStream(Allocator* alloc)
  46.         {
  47.                 assert(alloc != NULL);
  48.                 allocator = alloc;
  49.         }

  50. private:
  51.         //&#65533;&#65533;&#1465;&#65533;&#65533;vector&#65533;б&#65533;&#65533;&#65533;&#1464;&#65533;&#65533;
  52.         template<typename T>
  53.         void encode(const char* m_name, Json_Value_T& jobj, std::vector<T*>& list);

  54.         //&#65533;&#65533;&#1465;&#65533;&#65533;vector&#65533;б&#65533;&#65533;&#65533;&#1464;&#65533;&#65533;
  55.         template<typename T>
  56.         void decode(const char* m_name, Json_Value_T& jobj, std::vector<T*>& list);

  57.         void convert_2_jsonvalue(Json_Value_T& value, int32_t t) {value = t;}
  58.         void convert_2_jsonvalue(Json_Value_T& value, std::string& str)
  59.         {
  60.                 value.SetString(str.c_str(), str.size());
  61.         }
  62.        
  63.         void convert_2_jsonvalue(Json_Value_T& value, JsonInterface& json_obj);

  64.         void jsonvalue_2_T(Json_Value_T& value, int32_t& t)
  65.         {
  66.                 t = value.GetUint();
  67.         }

  68.         void jsonvalue_2_T(Json_Value_T& value, std::string& str)
  69.         {
  70.                 str = value.GetString();
  71.         }

  72.         void jsonvalue_2_T(Json_Value_T& value, JsonInterface& json_obj);

  73. private:
  74.         Allocator*        allocator;
  75. };

  76. typedef JsonStream<Doc_Allocator_T>                Json_Strm_T;

  77. class JsonInterface
  78. {
  79.         friend class JsonStream<Doc_Allocator_T>;

  80. public:
  81.         virtual void        Serialize(std::string& out)
  82.         {
  83.                 String_Buf_T strbuf;
  84.                 Doc_Allocator_T        allocator;
  85.                 Writer_T writer(strbuf, &allocator);

  86.                 Json_Strm_T jstrm(&allocator);

  87.                 Json_Value_T        ret_obj(rapidjson::kObjectType);
  88.                 try
  89.                 {
  90.                         encode(jstrm, ret_obj);
  91.                 }
  92.                 catch(...)
  93.                 {
  94.                         out.clear();
  95.                         return;
  96.                 }
  97.                
  98.                 ret_obj.Accept(writer);

  99.                 out = strbuf.GetString();
  100.         }

  101.         virtual int32_t        UnSerialize(const std::string& in, std::string& error)//0 is success
  102.         {
  103.                 Document_T        document;
  104.                
  105.                 if (document.Parse<0>(in.c_str()).HasParseError())
  106.                 {
  107.                         error = "json obj has parse error";
  108.                         return JSON_PARSE_ERR;
  109.                 }

  110.                 Doc_Allocator_T        allocator;
  111.                 Json_Strm_T jstrm(&allocator);
  112.                 try
  113.                 {
  114.                         decode(jstrm, document);
  115.                 }
  116.                 catch(const JsonErr& err)
  117.                 {
  118.                         error = err;
  119.                         return JSON_DECODE_ERR;
  120.                 }
  121.                 return JSON_SUCCESS;
  122.         }

  123. protected:
  124.         virtual Json_Strm_T& encode(Json_Strm_T& strm, Json_Value_T& jobj) = 0;
  125.         virtual Json_Strm_T& decode(Json_Strm_T& strm, Json_Value_T& jobj) = 0;
  126. };


  127. template<typename Allocator>
  128. void JsonStream<Allocator>::encode(const char* m_name, Json_Value_T& jobj, JsonInterface& t)
  129. {
  130.         Json_Value_T        t_obj(rapidjson::kObjectType);

  131.         t.encode(*this, t_obj);

  132.         if (jobj.IsObject())
  133.         {
  134.                 jobj.AddMember(m_name, t_obj, *allocator);
  135.         }
  136.         else
  137.                 throw JsonErr("encode error: jobj is not a obj, key is ") + m_name;
  138. }

  139. template<typename Allocator>
  140. void JsonStream<Allocator>::encode(const char* m_name, Json_Value_T& jobj, int32_t dest)
  141. {
  142.         if (jobj.IsObject())
  143.         {
  144.                 jobj.AddMember(m_name, dest, *allocator);
  145.         }
  146.         else
  147.                 throw JsonErr("encode error: jobj is not a obj, key is ") + m_name;
  148. }

  149. template<typename Allocator>
  150. void JsonStream<Allocator>::encode(const char* m_name, Json_Value_T& jobj, uint32_t dest)
  151. {
  152.         if (jobj.IsObject())
  153.         {
  154.                 jobj.AddMember(m_name, dest, *allocator);
  155.         }
  156.         else
  157.                 throw JsonErr("encode error: jobj is not a obj, key is ") + m_name;
  158. }

  159. template<typename Allocator>
  160. void JsonStream<Allocator>::encode(const char* m_name, Json_Value_T& jobj, int64_t dest)
  161. {
  162.         if (jobj.IsObject())
  163.         {
  164.                 jobj.AddMember(m_name, dest, *allocator);
  165.         }
  166.         else
  167.                 throw JsonErr("encode error: jobj is not a obj, key is ") + m_name;
  168. }

  169. template<typename Allocator>
  170. void JsonStream<Allocator>::encode(const char* m_name, Json_Value_T& jobj, uint64_t dest)
  171. {
  172.         if (jobj.IsObject())
  173.         {
  174.                 jobj.AddMember(m_name, dest, *allocator);
  175.         }
  176.         else
  177.                 throw JsonErr("encode error: jobj is not a obj, key is ") + m_name;
  178. }

  179. template<typename Allocator>
  180. void JsonStream<Allocator>::encode(const char* m_name, Json_Value_T& jobj, std::string& in)
  181. {
  182.         if (jobj.IsObject())
  183.         {
  184.                 jobj.AddMember(m_name, in.c_str(), *allocator);
  185.         }
  186.         else
  187.                 throw JsonErr("encode error: jobj is not a obj, key is ") + m_name;
  188. }

  189. template<typename Allocator>
  190. template<typename T>
  191. void JsonStream<Allocator>::encode(const char* m_name, Json_Value_T& jobj, std::vector<T>& list)
  192. {
  193.         Json_Value_T        t_obj(rapidjson::kArrayType);

  194.         for (typename std::vector<T>::size_type i = 0; i < list.size(); i++)
  195.         {
  196.                 Json_Value_T t;
  197.                 convert_2_jsonvalue(t, list[i]);

  198.                 t_obj.PushBack(t, *allocator);
  199.         }
  200.         if (jobj.IsObject())
  201.         {
  202.                 jobj.AddMember(m_name, t_obj, *allocator);
  203.         }
  204.         else
  205.                 throw JsonErr("encode error: jobj is not a obj, key is ") + m_name;
  206. }

  207. template<typename Allocator>
  208. void JsonStream<Allocator>::decode(const char* m_name, Json_Value_T& jobj, JsonInterface& t)
  209. {
  210.         if (!jobj.HasMember(m_name))
  211.                 throw JsonErr("json has not a member of ") + m_name;

  212.         if (!jobj[m_name].IsObject())
  213.                 throw JsonErr("json wrong fomat object: ") + m_name;
  214.        
  215.         t.decode(*this, jobj[m_name]);
  216. }

  217. template<typename Allocator>
  218. void JsonStream<Allocator>::decode(const char* m_name, Json_Value_T& jobj, int32_t& dest)
  219. {
  220.         if (!jobj.HasMember(m_name))
  221.                 throw JsonErr("json has not a member of ") + m_name;
  222.        
  223.         if (jobj[m_name].IsInt())
  224.         {
  225.                 dest = jobj[m_name].GetInt();
  226.         }
  227.         else
  228.                 throw JsonErr(m_name) + " is not a int";
  229. }

  230. template<typename Allocator>
  231. void JsonStream<Allocator>::decode(const char* m_name, Json_Value_T& jobj, uint32_t& dest)
  232. {
  233.         if (!jobj.HasMember(m_name))
  234.                 throw JsonErr("json has not a member of ") + m_name;

  235.         if (jobj[m_name].IsUint())
  236.         {
  237.                 dest = jobj[m_name].GetUint();
  238.         }
  239.         else
  240.                 throw JsonErr(m_name) + " is not a uint";
  241. }

  242. template<typename Allocator>
  243. void JsonStream<Allocator>::decode(const char* m_name, Json_Value_T& jobj, int64_t& dest)
  244. {
  245.         if (!jobj.HasMember(m_name))
  246.                 throw JsonErr("json has not a member of ") + m_name;

  247.         if (jobj[m_name].IsInt64())
  248.         {
  249.                 dest = jobj[m_name].GetInt64();
  250.         }
  251.         else
  252.                 throw JsonErr(m_name) + " is not a int64";
  253. }

  254. template<typename Allocator>
  255. void JsonStream<Allocator>::decode(const char* m_name, Json_Value_T& jobj, uint64_t& dest)
  256. {
  257.         if (!jobj.HasMember(m_name))
  258.                 throw JsonErr("json has not a member of ") + m_name;

  259.         if (jobj[m_name].IsUint64())
  260.         {
  261.                 dest = jobj[m_name].GetUint64();
  262.         }
  263.         else
  264.                 throw JsonErr(m_name) + " is not a uint64";
  265. }

  266. template<typename Allocator>
  267. void JsonStream<Allocator>::decode(const char* m_name, Json_Value_T& jobj, std::string& out)
  268. {
  269.         if (!jobj.HasMember(m_name))
  270.                 throw JsonErr("json has not a member of ") + m_name;
  271.        
  272.         if (jobj[m_name].IsString())
  273.         {
  274.                 out = jobj[m_name].GetString();
  275.         }
  276.         else
  277.                 throw JsonErr(m_name) + " is not a string";
  278. }

  279. template<typename Allocator>
  280. template<typename T>
  281. void JsonStream<Allocator>::decode(const char* m_name, Json_Value_T& jobj, std::vector<T>& list)
  282. {
  283.         if (!jobj.HasMember(m_name))
  284.                 throw JsonErr("json has not a member of ") + m_name;
  285.        
  286.         if (jobj[m_name].IsArray())
  287.         {
  288.                 T t;

  289.                 for (Json_Size_T i = 0; i < jobj[m_name].Size(); i++)
  290.                 {
  291.                         jsonvalue_2_T(jobj[m_name][i], t);
  292.                         list.push_back(t);
  293.                 }
  294.         }
  295.         else
  296.                 throw JsonErr(m_name) + " is not a array";
  297. }

  298. template<typename Allocator>
  299. void JsonStream<Allocator>::convert_2_jsonvalue(Json_Value_T& value, JsonInterface& json_obj)
  300. {
  301.         value.SetObject();
  302.         json_obj.encode(*this, value);
  303. }

  304. template<typename Allocator>
  305. void JsonStream<Allocator>::jsonvalue_2_T(Json_Value_T& value, JsonInterface& json_obj)
  306. {
  307.         json_obj.decode(*this, value);
  308. }

  309. END_JSON_NS
  310. #endif
复制代码
结帖率:67% (2/3)
发表于 2023-4-9 09:16:06 | 显示全部楼层   广西壮族自治区南宁市
瞧得迷迷糊糊的
回复 支持 反对

使用道具 举报

发表于 2013-4-4 08:54:46 | 显示全部楼层   河南省驻马店市
打一瓶酱油
回复 支持 反对

使用道具 举报

发表于 2013-3-25 09:50:50 | 显示全部楼层   云南省文山壮族苗族自治州
瞧得迷迷糊糊的


三七网www.nc37.com
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)
发表于 2013-3-20 11:12:49 | 显示全部楼层   吉林省松原市
迅雷坑爹啊,下载下了的是php文件啊,再次下载还要扣分啊

本文章来自:精易论坛(http://bbs.125.la/forum.php?mod=viewthread&tid=13614235)请保留此链接, 感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表