tc_json.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. 
  2. #ifndef __TC_JSON_H
  3. #define __TC_JSON_H
  4. #include <string>
  5. #include <unordered_map>
  6. #include <vector>
  7. #include <assert.h>
  8. #include <stdio.h>
  9. #include "util/tc_autoptr.h"
  10. using namespace std;
  11. namespace tars
  12. {
  13. /**
  14. * 编解码抛出的异常
  15. */
  16. struct TC_Json_Exception : public TC_Exception
  17. {
  18. TC_Json_Exception(const string &buffer) : TC_Exception(buffer){};
  19. ~TC_Json_Exception() throw(){};
  20. };
  21. enum eJsonType
  22. {
  23. eJsonTypeString,
  24. eJsonTypeNum,
  25. eJsonTypeObj,
  26. eJsonTypeArray,
  27. eJsonTypeBoolean
  28. };
  29. /*
  30. * json类型的基类。没有任何意义
  31. */
  32. class JsonValue : public TC_HandleBase
  33. {
  34. public:
  35. virtual eJsonType getType()=0;
  36. virtual ~JsonValue()
  37. {
  38. }
  39. };
  40. typedef TC_AutoPtr<JsonValue> JsonValuePtr;
  41. /*
  42. * json类型 string类型 例如"dd\ndfd"
  43. */
  44. class JsonValueString : public JsonValue
  45. {
  46. public:
  47. JsonValueString(const string & s):value(s)
  48. {
  49. }
  50. JsonValueString()
  51. {
  52. }
  53. eJsonType getType()
  54. {
  55. return eJsonTypeString;
  56. }
  57. virtual ~JsonValueString()
  58. {
  59. }
  60. string value;
  61. };
  62. typedef TC_AutoPtr<JsonValueString> JsonValueStringPtr;
  63. /*
  64. * json类型 number类型 例如 1.5e8
  65. */
  66. class JsonValueNum : public JsonValue
  67. {
  68. public:
  69. JsonValueNum(double d,bool b=false):value(d),isInt(b)
  70. {
  71. }
  72. JsonValueNum()
  73. {
  74. isInt=false;
  75. value=0.0f;
  76. }
  77. eJsonType getType()
  78. {
  79. return eJsonTypeNum;
  80. }
  81. virtual ~JsonValueNum(){}
  82. public:
  83. double value;
  84. bool isInt;
  85. };
  86. typedef TC_AutoPtr<JsonValueNum> JsonValueNumPtr;
  87. /*
  88. * json类型 object类型 例如 {"aa","bb"}
  89. */
  90. class JsonValueObj: public JsonValue
  91. {
  92. public:
  93. eJsonType getType()
  94. {
  95. return eJsonTypeObj;
  96. }
  97. const JsonValuePtr &get(const char *name)
  98. {
  99. auto it = value.find(name);
  100. if(it == value.end())
  101. {
  102. char s[64];
  103. snprintf(s, sizeof(s), "get obj error(key is not exists)[key:%s]", name);
  104. throw TC_Json_Exception(s);
  105. }
  106. return it->second;
  107. }
  108. virtual ~JsonValueObj(){}
  109. public:
  110. unordered_map<string,JsonValuePtr> value;
  111. };
  112. typedef TC_AutoPtr<JsonValueObj> JsonValueObjPtr;
  113. /*
  114. * json类型 array类型 例如 ["aa","bb"]
  115. */
  116. class JsonValueArray: public JsonValue
  117. {
  118. public:
  119. eJsonType getType()
  120. {
  121. return eJsonTypeArray;
  122. }
  123. void push_back(JsonValuePtr & p)
  124. {
  125. value.push_back(p);
  126. }
  127. virtual ~JsonValueArray(){}
  128. public:
  129. vector<JsonValuePtr> value;
  130. };
  131. typedef TC_AutoPtr<JsonValueArray> JsonValueArrayPtr;
  132. /*
  133. * json类型 boolean类型 例如 true
  134. */
  135. class JsonValueBoolean : public JsonValue
  136. {
  137. public:
  138. eJsonType getType()
  139. {
  140. return eJsonTypeBoolean;
  141. }
  142. bool getValue()
  143. {
  144. return value;
  145. }
  146. virtual ~JsonValueBoolean(){}
  147. public:
  148. bool value;
  149. };
  150. typedef TC_AutoPtr<JsonValueBoolean> JsonValueBooleanPtr;
  151. /*
  152. * 分析json字符串用到的 读字符的类
  153. */
  154. class BufferJsonReader
  155. {
  156. const char * _buf; ///< 缓冲区
  157. size_t _buf_len; ///< 缓冲区长度
  158. size_t _cur; ///< 当前位置
  159. public:
  160. BufferJsonReader () :_buf(NULL),_buf_len(0), _cur(0) {}
  161. void reset() { _cur = 0;}
  162. void setBuffer(const char * buf, size_t len)
  163. {
  164. _buf = buf;
  165. _buf_len = len;
  166. _cur = 0;
  167. }
  168. void setBuffer(const std::vector<char> &buf)
  169. {
  170. _buf = buf.data();
  171. _buf_len = buf.size();
  172. _cur = 0;
  173. }
  174. size_t getCur()
  175. {
  176. return _cur;
  177. }
  178. const char * getPoint()
  179. {
  180. return _buf+_cur;
  181. }
  182. char read()
  183. {
  184. check();
  185. _cur ++;
  186. return *(_buf+_cur-1);
  187. }
  188. char get()
  189. {
  190. check();
  191. return *(_buf+_cur);
  192. }
  193. char getBack()
  194. {
  195. assert(_cur>0);
  196. return *(_buf+_cur-1);
  197. }
  198. void back()
  199. {
  200. assert(_cur>0);
  201. _cur--;
  202. }
  203. void check()
  204. {
  205. if (_cur + 1 > _buf_len)
  206. {
  207. char s[64];
  208. snprintf(s, sizeof(s), "buffer overflow when peekBuf, over %u.", (uint32_t)_buf_len);
  209. throw TC_Json_Exception(s);
  210. }
  211. }
  212. bool hasEnd()
  213. {
  214. return _cur >= _buf_len;
  215. }
  216. };
  217. /*
  218. * 分析json的类。都是static
  219. */
  220. class TC_Json
  221. {
  222. public:
  223. //json类型到字符串的转换
  224. static string writeValue(const JsonValuePtr & p);
  225. static void writeValue(const JsonValuePtr & p, string& ostr);
  226. static void writeValue(const JsonValuePtr & p, vector<char>& buf);
  227. //json字符串到json结构的转换
  228. static JsonValuePtr getValue(const string & str);
  229. static JsonValuePtr getValue(const vector<char>& buf);
  230. private:
  231. //string 类型到json字符串
  232. static void writeString(const JsonValueStringPtr & p, string& ostr);
  233. static void writeString(const string & s, string& ostr);
  234. //num 类型到json字符串
  235. static void writeNum(const JsonValueNumPtr & p, string& ostr);
  236. //obj 类型到json字符串
  237. static void writeObj(const JsonValueObjPtr & p, string& ostr);
  238. //array 类型到json字符串
  239. static void writeArray(const JsonValueArrayPtr & p, string& ostr);
  240. //boolean 类型到json字符串
  241. static void writeBoolean(const JsonValueBooleanPtr & p, string& ostr);
  242. //读取json的value类型 也就是所有的json类型 如果不符合规范会抛异常
  243. static JsonValuePtr getValue(BufferJsonReader & reader);
  244. //读取json的object 如果不符合规范会抛异常
  245. static JsonValueObjPtr getObj(BufferJsonReader & reader);
  246. //读取json的array(数组) 如果不符合规范会抛异常
  247. static JsonValueArrayPtr getArray(BufferJsonReader & reader);
  248. //读取json的string 如 "dfdf" 如果不符合规范会抛异常
  249. static JsonValueStringPtr getString(BufferJsonReader & reader,char head='\"');
  250. //读取json的数字 如 -213.56 如果不符合规范会抛异常
  251. static JsonValueNumPtr getNum(BufferJsonReader & reader,char head);
  252. //读取json的boolean值 如 true false 如果不符合规范会抛异常
  253. static JsonValueBooleanPtr getBoolean(BufferJsonReader & reader,char c);
  254. //读取json的 null 如果不符合规范会抛异常
  255. static JsonValuePtr getNull(BufferJsonReader & reader,char c);
  256. //获取16进制形式的值 如\u003f 如果不符合规范会抛异常
  257. static uint32_t getHex(BufferJsonReader & reader);
  258. //判断一个字符是否符合json定义的空白字符
  259. static bool isspace(char c);
  260. };
  261. class TC_JsonWriteOstream
  262. {
  263. public:
  264. static void writeValue(const JsonValuePtr & p, ostream& ostr);
  265. private:
  266. //string 类型到json字符串
  267. static void writeString(const JsonValueStringPtr & p, ostream& ostr);
  268. static void writeString(const string & s, ostream& ostr);
  269. //num 类型到json字符串
  270. static void writeNum(const JsonValueNumPtr & p, ostream& ostr);
  271. //obj 类型到json字符串
  272. static void writeObj(const JsonValueObjPtr & p, ostream& ostr);
  273. //array 类型到json字符串
  274. static void writeArray(const JsonValueArrayPtr & p, ostream& ostr);
  275. //boolean 类型到json字符串
  276. static void writeBoolean(const JsonValueBooleanPtr & p, ostream& ostr);
  277. };
  278. }
  279. #endif