1
0

jsonBuilder.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. #include "jsonBuilder.h"
  2. #include <cstdlib>
  3. #include <rapidjson/writer.h>
  4. #include <rapidjson/stringbuffer.h>
  5. #include <rapidjson/prettywriter.h>
  6. #include "constdef.h"
  7. namespace YA
  8. {
  9. jsonBuilder::jsonBuilder()
  10. {
  11. }
  12. jsonBuilder::~jsonBuilder()
  13. {
  14. }
  15. std::string jsonBuilder::__FmtCardID( const _BASE_CARD_ & CardPos )
  16. {
  17. std::string ID;
  18. char szID[32] = { 0 };
  19. switch ( CardPos.Type )
  20. {
  21. case 1://人卡
  22. {
  23. sprintf( szID, "001%.10d", CardPos.ID );
  24. }
  25. break;
  26. case 2://车卡
  27. {
  28. sprintf( szID, "002%.10d", CardPos.ID );
  29. }
  30. break;
  31. }
  32. ID = szID;
  33. return ID;
  34. }
  35. void jsonBuilder::__AddVersion( rapidjson::Value& root, rapidjson::Document::AllocatorType& Allocator )
  36. {
  37. rapidjson::Value value( rapidjson::kStringType );
  38. value.SetString( INTERFACE_VERSION_1_4, Allocator );
  39. root.AddMember( JSON_ROOT_KEY_VERSION, value, Allocator );
  40. }
  41. void jsonBuilder::__SetCmd( const char* szCmd, rapidjson::Value & root, rapidjson::Document::AllocatorType & Allocator )
  42. {
  43. rapidjson::Value value( rapidjson::kStringType );
  44. value.SetString( szCmd, Allocator );
  45. root.AddMember( JSON_ROOT_KEY_CMD, value, Allocator );
  46. }
  47. bool jsonBuilder::__BuildDetail( const _CARD_POS_ & CardPos, rapidjson::Document::AllocatorType& Allocator, rapidjson::Value & DetailItem )
  48. {
  49. rapidjson::Value Array( rapidjson::kArrayType );
  50. rapidjson::Value tmp_object( rapidjson::kObjectType );
  51. //0 ID
  52. tmp_object.SetString( __FmtCardID( CardPos ).c_str(), Allocator );
  53. Array.PushBack( tmp_object, Allocator );
  54. //1 x
  55. tmp_object.SetDouble( CardPos.x );
  56. Array.PushBack( tmp_object, Allocator );
  57. //2 y
  58. tmp_object.SetDouble( CardPos.y );
  59. Array.PushBack( tmp_object, Allocator );
  60. //3 入井时间戳
  61. tmp_object.SetDouble( CardPos.down_time );
  62. Array.PushBack( tmp_object, Allocator );
  63. //4 进入区域时间戳
  64. tmp_object.SetDouble( CardPos.enter_area_time );
  65. Array.PushBack( tmp_object, Allocator );
  66. //5 最后接收时间戳
  67. tmp_object.SetDouble( CardPos.rec_time );
  68. Array.PushBack( tmp_object, Allocator );
  69. //6 工作时长
  70. tmp_object.SetDouble( CardPos.work_time );
  71. Array.PushBack( tmp_object, Allocator );
  72. //7 地图编号
  73. tmp_object.SetInt( CardPos.map_id );
  74. Array.PushBack( tmp_object, Allocator );
  75. //8 区域编号
  76. tmp_object.SetInt( CardPos.area_id );
  77. Array.PushBack( tmp_object, Allocator );
  78. //9 部门编号
  79. tmp_object.SetInt( CardPos.dept_id );
  80. Array.PushBack( tmp_object, Allocator );
  81. //10 状态
  82. tmp_object.SetInt( CardPos.stat );
  83. Array.PushBack( tmp_object, Allocator );
  84. //11 运行状态
  85. tmp_object.SetInt( CardPos.running_stat );
  86. Array.PushBack( tmp_object, Allocator );
  87. //12 业务状态
  88. tmp_object.SetInt( CardPos.biz_stat );
  89. Array.PushBack( tmp_object, Allocator );
  90. //13 速度
  91. tmp_object.SetDouble( CardPos.speed );
  92. Array.PushBack( tmp_object, Allocator );
  93. //14 地标编号
  94. tmp_object.SetInt( CardPos.landmark_id );
  95. Array.PushBack( tmp_object, Allocator );
  96. //15 地标方向
  97. tmp_object.SetInt( CardPos.lm_direction );
  98. Array.PushBack( tmp_object, Allocator );
  99. //16 距离地标的距离
  100. tmp_object.SetDouble( CardPos.landmark_dis );
  101. Array.PushBack( tmp_object, Allocator );
  102. //17 级别编号
  103. tmp_object.SetInt( CardPos.level_id );
  104. Array.PushBack( tmp_object, Allocator );
  105. //18 车辆当天出勤的标识
  106. tmp_object.SetInt( CardPos.is_on_duty );
  107. Array.PushBack( tmp_object, Allocator );
  108. DetailItem = Array;
  109. return true;
  110. }
  111. bool jsonBuilder::__BuildDept( const std::map<int, _STAT_DEPT_ITEM_>& dept_map, rapidjson::Document::AllocatorType & Allocator, rapidjson::Value & Dept )
  112. {
  113. std::map<int, _STAT_DEPT_ITEM_>::const_iterator mit_dept;
  114. for ( mit_dept = dept_map.begin(); mit_dept != dept_map.end(); mit_dept++ )
  115. {
  116. rapidjson::Value DeptItem( rapidjson::kObjectType );
  117. __BuildDeptItem( mit_dept->second, Allocator, DeptItem );
  118. rapidjson::Value dept_id( rapidjson::kObjectType );
  119. char szNum[20] = { 0 };
  120. //itoa( mit_dept->second.DeptID, szNum, 10 );
  121. sprintf(szNum,"%d",mit_dept->second.DeptID);
  122. dept_id.SetString( szNum, strlen( szNum ), Allocator );
  123. Dept.AddMember( dept_id, DeptItem, Allocator );
  124. }
  125. return true;
  126. }
  127. void jsonBuilder::__BuildDeptItem( const _STAT_DEPT_ITEM_ & st_dept_item, rapidjson::Document::AllocatorType & Allocator, rapidjson::Value & DeptItem )
  128. {
  129. //Area
  130. __BuildIDSumMap( st_dept_item.Area, JSON_ROOT_KEY_STATISTIC_AREA, Allocator, DeptItem );
  131. //Dept
  132. __BuildIDSumMap( st_dept_item.Dept, JSON_ROOT_KEY_STATISTIC_DEPT, Allocator, DeptItem );
  133. //occupation_level
  134. __BuildIDSumMap( st_dept_item.OcptLvl, JSON_ROOT_KEY_STATISTIC_LEVEL, Allocator, DeptItem );
  135. //sum
  136. rapidjson::Value Sum( rapidjson::kObjectType );
  137. Sum.SetInt( st_dept_item.Sum );
  138. DeptItem.AddMember( JSON_ROOT_KEY_STATISTIC_SUM, Sum, Allocator );
  139. }
  140. void jsonBuilder::__BuildBaseCardItem( const _BASE_CARD_ & Card, rapidjson::Document::AllocatorType & Allocator, rapidjson::Value & CardItem )
  141. {
  142. rapidjson::Value TmpObj( rapidjson::kObjectType );
  143. rapidjson::Value CardObj( rapidjson::kArrayType );
  144. //0 卡号
  145. TmpObj.SetString( __FmtCardID( Card ).c_str(), Allocator );
  146. CardObj.PushBack( TmpObj, Allocator );
  147. //1 x坐标
  148. TmpObj.SetDouble( Card.x );
  149. CardObj.PushBack( TmpObj, Allocator );
  150. //2 y坐标
  151. TmpObj.SetDouble( Card.y );
  152. CardObj.PushBack( TmpObj, Allocator );
  153. //3 入井时间戳
  154. TmpObj.SetDouble( Card.down_time );
  155. CardObj.PushBack( TmpObj, Allocator );
  156. //4 进入区域时间戳
  157. TmpObj.SetDouble( Card.enter_area_time );
  158. CardObj.PushBack( TmpObj, Allocator );
  159. //5 接收时间戳
  160. TmpObj.SetDouble( Card.rec_time );
  161. CardObj.PushBack( TmpObj, Allocator );
  162. //6 工作时长
  163. TmpObj.SetDouble( Card.work_time );
  164. CardObj.PushBack( TmpObj, Allocator );
  165. //7 地图编号
  166. TmpObj.SetInt( Card.map_id );
  167. CardObj.PushBack( TmpObj, Allocator );
  168. //8 区域编号
  169. TmpObj.SetInt( Card.area_id );
  170. CardObj.PushBack( TmpObj, Allocator );
  171. //9 部门编号
  172. TmpObj.SetInt( Card.dept_id );
  173. CardObj.PushBack( TmpObj, Allocator );
  174. //10 状态
  175. TmpObj.SetInt( Card.stat );
  176. CardObj.PushBack( TmpObj, Allocator );
  177. //11 运行状态
  178. TmpObj.SetInt( Card.running_stat );
  179. CardObj.PushBack( TmpObj, Allocator );
  180. //12 业务状态
  181. TmpObj.SetInt( Card.biz_stat );
  182. CardObj.PushBack( TmpObj, Allocator );
  183. //13 速度
  184. TmpObj.SetDouble( Card.speed );
  185. CardObj.PushBack( TmpObj, Allocator );
  186. CardItem = CardObj;
  187. }
  188. void jsonBuilder::__CreateDeptMap( const _CARD_POS_ & CardPos, std::map<int, _STAT_DEPT_ITEM_>& DeptMap )
  189. {
  190. std::map<int, _STAT_DEPT_ITEM_>::iterator mit_dept_map;
  191. mit_dept_map = DeptMap.find( CardPos.dept_id );
  192. if ( mit_dept_map == DeptMap.end() )
  193. {
  194. _STAT_DEPT_ITEM_ sdItem;
  195. sdItem.DeptID = CardPos.dept_id;
  196. sdItem.Area.insert( std::make_pair( CardPos.area_id, 1 ) );
  197. sdItem.Dept.insert( std::make_pair( CardPos.dept_id, 1 ) );
  198. sdItem.OcptLvl.insert( std::make_pair( CardPos.level_id, 1 ) );
  199. sdItem.Sum = 1;
  200. DeptMap.insert( std::make_pair( sdItem.DeptID, sdItem ) );
  201. }
  202. else
  203. {
  204. __CreateDeptItem( CardPos, mit_dept_map->second );
  205. }
  206. }
  207. void jsonBuilder::__CreateDeptItem( const _CARD_POS_ & CardPos, _STAT_DEPT_ITEM_ & DeptItem )
  208. {
  209. std::map<int, int>::iterator mit_id_sum;
  210. //area
  211. mit_id_sum = DeptItem.Area.find( CardPos.area_id );
  212. if ( mit_id_sum == DeptItem.Area.end() )
  213. {
  214. DeptItem.Area.insert( std::make_pair( CardPos.area_id, 1 ) );
  215. }
  216. else
  217. {
  218. mit_id_sum->second++;
  219. }
  220. //Dept
  221. mit_id_sum = DeptItem.Dept.find( CardPos.dept_id );
  222. if ( mit_id_sum == DeptItem.Dept.end() )
  223. {
  224. DeptItem.Dept.insert( std::make_pair( CardPos.dept_id, 1 ) );
  225. }
  226. else
  227. {
  228. mit_id_sum->second++;
  229. }
  230. //occupation_level
  231. mit_id_sum = DeptItem.OcptLvl.find( CardPos.level_id );
  232. if ( mit_id_sum == DeptItem.OcptLvl.end() )
  233. {
  234. DeptItem.OcptLvl.insert( std::make_pair( CardPos.level_id, 1 ) );
  235. }
  236. else
  237. {
  238. mit_id_sum->second++;
  239. }
  240. //Sum
  241. DeptItem.Sum++;
  242. }
  243. void jsonBuilder::__BuildIDSumMap( const std::map<int, int>& id_sum_map, const char* szName, rapidjson::Document::AllocatorType & Allocator, rapidjson::Value & Parent )
  244. {
  245. rapidjson::Value Array( rapidjson::kArrayType );
  246. std::map<int, int>::const_iterator mit_id_sum;
  247. for ( mit_id_sum = id_sum_map.begin(); mit_id_sum != id_sum_map.end(); mit_id_sum++ )
  248. {
  249. rapidjson::Value Item( rapidjson::kArrayType );
  250. rapidjson::Value tmpobj( rapidjson::kObjectType );
  251. tmpobj.SetInt( mit_id_sum->first );
  252. Item.PushBack( tmpobj, Allocator );
  253. tmpobj.SetInt( mit_id_sum->second );
  254. Item.PushBack( tmpobj, Allocator );
  255. Array.PushBack( Item, Allocator );
  256. }
  257. Parent.AddMember( rapidjson::StringRef( szName ), Array, Allocator );
  258. }
  259. std::string jsonBuilder::BuildLogin( const _JS_LOGIN_& Login )
  260. {
  261. rapidjson::StringBuffer sb;
  262. rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
  263. rapidjson::Document doc;
  264. rapidjson::Document::AllocatorType& Allocator = doc.GetAllocator();
  265. rapidjson::Value root( rapidjson::kObjectType );
  266. rapidjson::Value child( rapidjson::kObjectType );
  267. rapidjson::Value value( rapidjson::kStringType );
  268. __SetCmd( JSON_CMD_VALUE_LOGIN, root, Allocator );
  269. value.SetString( Login.user_name.c_str(), Allocator );
  270. child.AddMember( JSON_KEY_USERNAME, value, Allocator );
  271. value.SetString( Login.user_password.c_str(), Allocator );
  272. child.AddMember( JSON_KEY_PASSWORD, value, Allocator );
  273. root.AddMember( JSON_ROOT_KEY_DATA, child, Allocator );
  274. root.Accept( writer );
  275. return sb.GetString();
  276. }
  277. std::string jsonBuilder::BuildCardPos( const std::map<uint64_t, _CARD_POS_>& CardPosList )
  278. {
  279. rapidjson::StringBuffer sb;
  280. rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
  281. rapidjson::Document doc;
  282. rapidjson::Document::AllocatorType& Allocator = doc.GetAllocator();
  283. rapidjson::Value root( rapidjson::kObjectType );
  284. __SetCmd( JSON_CMD_VALUE_POS_MAP, root, Allocator );
  285. rapidjson::Value s( rapidjson::kObjectType );
  286. rapidjson::Value v( rapidjson::kObjectType );
  287. rapidjson::Value s_Detail( rapidjson::kArrayType );
  288. rapidjson::Value v_Detail( rapidjson::kArrayType );
  289. rapidjson::Value s_dept( rapidjson::kObjectType );
  290. rapidjson::Value v_dept( rapidjson::kObjectType );
  291. std::map<int, _STAT_DEPT_ITEM_> s_dept_map;
  292. std::map<int, _STAT_DEPT_ITEM_> v_dept_map;
  293. _STAT_DEPT_ITEM_ s_glbl_item;
  294. _STAT_DEPT_ITEM_ v_glbl_item;
  295. std::map<uint64_t, _CARD_POS_>::const_iterator mit_card;
  296. for ( mit_card = CardPosList.begin(); mit_card != CardPosList.end(); mit_card++ )
  297. {
  298. //不显示的卡不往前端推送
  299. if ( !mit_card->second.display )
  300. {
  301. continue;
  302. }
  303. rapidjson::Value DetailItem;
  304. if ( !__BuildDetail( mit_card->second, Allocator, DetailItem ) )
  305. {
  306. continue;
  307. }
  308. switch ( mit_card->second.Type )
  309. {
  310. case 1://人卡
  311. {
  312. s_Detail.PushBack( DetailItem, Allocator );
  313. __CreateDeptMap( mit_card->second, s_dept_map );
  314. __CreateDeptItem( mit_card->second, s_glbl_item );
  315. }
  316. break;
  317. case 2://车卡
  318. {
  319. v_Detail.PushBack( DetailItem, Allocator );
  320. __CreateDeptMap( mit_card->second, v_dept_map );
  321. __CreateDeptItem( mit_card->second, v_glbl_item );
  322. }
  323. break;
  324. }
  325. }
  326. s.AddMember( JSON_ROOT_KEY_STATISTIC_DETAIL, s_Detail, Allocator );
  327. v.AddMember( JSON_ROOT_KEY_STATISTIC_DETAIL, v_Detail, Allocator );
  328. //stat
  329. rapidjson::Value s_stat( rapidjson::kObjectType );
  330. rapidjson::Value v_stat( rapidjson::kObjectType );
  331. if ( __BuildDept( s_dept_map, Allocator, s_dept ) )
  332. {
  333. s_stat.AddMember( JSON_ROOT_KEY_STATISTIC_DEPT, s_dept, Allocator );
  334. }
  335. if ( __BuildDept( v_dept_map, Allocator, v_dept ) )
  336. {
  337. v_stat.AddMember( JSON_ROOT_KEY_STATISTIC_DEPT, v_dept, Allocator );
  338. }
  339. //glbl
  340. rapidjson::Value s_glbl( rapidjson::kObjectType );
  341. rapidjson::Value v_glbl( rapidjson::kObjectType );
  342. __BuildDeptItem( s_glbl_item, Allocator, s_glbl );
  343. __BuildDeptItem( v_glbl_item, Allocator, v_glbl );
  344. //s.AddMember( JSON_ROOT_KEY_STATISTIC_GLOBAL, s_glbl, Allocator );
  345. //v.AddMember( JSON_ROOT_KEY_STATISTIC_GLOBAL, v_glbl, Allocator );
  346. s_stat.AddMember( JSON_ROOT_KEY_STATISTIC_GLOBAL, s_glbl, Allocator );
  347. v_stat.AddMember( JSON_ROOT_KEY_STATISTIC_GLOBAL, v_glbl, Allocator );
  348. s.AddMember( JSON_ROOT_KEY_STATISTIC_STAT, s_stat, Allocator );
  349. v.AddMember( JSON_ROOT_KEY_STATISTIC_STAT, v_stat, Allocator );
  350. rapidjson::Value Data( rapidjson::kObjectType );
  351. Data.AddMember( JSON_ROOT_KEY_STATISTIC_STAFF_DATA, s, Allocator );
  352. Data.AddMember( JSON_ROOT_KEY_STATISTIC_VEHICLE_DATA, v, Allocator );
  353. root.AddMember( JSON_ROOT_KEY_DATA, Data, Allocator );
  354. __AddVersion( root, Allocator );
  355. root.Accept( writer );
  356. return sb.GetString();
  357. }
  358. std::string jsonBuilder::BuildSpecialAreaProcess( const _BASE_CARD_ & stCard )
  359. {
  360. rapidjson::StringBuffer sb;
  361. rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
  362. rapidjson::Document doc;
  363. rapidjson::Document::AllocatorType& Allocator = doc.GetAllocator();
  364. rapidjson::Value root( rapidjson::kObjectType );
  365. __SetCmd( JSON_CMD_VALUE_SPECIAL_AREA_UP_MINE, root, Allocator );
  366. rapidjson::Value CardItem( rapidjson::kObjectType );
  367. rapidjson::Value CardList( rapidjson::kArrayType );
  368. __BuildBaseCardItem( stCard, Allocator, CardItem );
  369. CardList.PushBack( CardItem, Allocator );
  370. root.AddMember( JSON_ROOT_KEY_DATA, CardList, Allocator );
  371. root.Accept( writer );
  372. return sb.GetString();
  373. }
  374. bool jsonBuilder::ParseCall_Card_Req( const std::string& JasonText, _JS_CALL_CARD_REQ_& CallCardReq, std::string& Error )
  375. {
  376. rapidjson::Document doc;
  377. if ( doc.Parse( JasonText.c_str() ).HasParseError() )
  378. {
  379. Error = "Failed to parse jason text!";
  380. return false;
  381. }
  382. rapidjson::Value::MemberIterator itValue;
  383. itValue = doc.FindMember( "data" );
  384. if ( itValue == doc.MemberEnd() )
  385. {
  386. Error = "Failed to find member: data!";
  387. return false;
  388. }
  389. rapidjson::Value Data;
  390. rapidjson::Document::AllocatorType allocator;
  391. Data.CopyFrom( itValue->value, allocator );
  392. if ( !Data.HasMember( JSON_KEY_CALL_CARD_CALL_TYPE ) )
  393. {
  394. Error = "Failed to find value: ";
  395. Error += JSON_KEY_CALL_CARD_CALL_TYPE;
  396. return false;
  397. }
  398. CallCardReq.call_type_id = Data[JSON_KEY_CALL_CARD_CALL_TYPE].GetInt();
  399. if ( !Data.HasMember( JSON_KEY_CALL_CARD_CALL_TIME_OUT ) )
  400. {
  401. Error = "Failed to find value: ";
  402. Error += JSON_KEY_CALL_CARD_CALL_TIME_OUT;
  403. return false;
  404. }
  405. CallCardReq.call_time_out = Data[JSON_KEY_CALL_CARD_CALL_TIME_OUT].GetInt();
  406. if ( !Data.HasMember( JSON_KEY_CALL_CARD_CALL_LEVEL ) )
  407. {
  408. Error = "Failed to find value: ";
  409. Error += JSON_KEY_CALL_CARD_CALL_LEVEL;
  410. return false;
  411. }
  412. CallCardReq.call_time_interval = Data[JSON_KEY_CALL_CARD_CALL_LEVEL].GetInt();
  413. if ( !Data.HasMember( JSON_KEY_CALL_CARD_USER_NAME ) )
  414. {
  415. Error = "Failed to find value: ";
  416. Error += JSON_KEY_CALL_CARD_USER_NAME;
  417. return false;
  418. }
  419. CallCardReq.user_name = Data[JSON_KEY_CALL_CARD_USER_NAME].GetString();
  420. //data::stations
  421. if ( !Data.HasMember( JSON_KEY_CALL_CARD_STATIONS ) )
  422. {
  423. Error = "Failed to find value: ";
  424. Error += JSON_KEY_CALL_CARD_STATIONS;
  425. return false;
  426. }
  427. rapidjson::Value & stations = Data[JSON_KEY_CALL_CARD_STATIONS];
  428. if ( !stations.IsArray() )
  429. {
  430. Error = "data::stations is not a valid array!";
  431. return false;
  432. }
  433. for ( int i = 0; i < (int)stations.Size(); ++i )
  434. {
  435. rapidjson::Value & v = stations[i];
  436. if ( !v.IsObject() )
  437. {
  438. char szError[1024] = { 0 };
  439. sprintf( szError, "data::stations[%d] is not a object!", i );
  440. Error = szError;
  441. return false;
  442. }
  443. _JS_STATION_ Station;
  444. if ( !v.HasMember( JSON_KEY_CALL_CARD_STATION_ID ) && v[JSON_KEY_CALL_CARD_STATION_ID].IsInt() )
  445. {
  446. Error = "Error, failed to found value: ";
  447. Error += JSON_KEY_CALL_CARD_STATION_ID;
  448. return false;
  449. }
  450. Station.stationid = v[JSON_KEY_CALL_CARD_STATION_ID].GetInt();
  451. CallCardReq.stations.push_back( Station );
  452. }
  453. //data::cards
  454. if ( !Data.HasMember( JSON_KEY_CALL_CARD_CARDS ) )
  455. {
  456. Error = "Failed to find value: ";
  457. Error += JSON_KEY_CALL_CARD_CARDS;
  458. return false;
  459. }
  460. rapidjson::Value & cards = Data[JSON_KEY_CALL_CARD_CARDS];
  461. for ( int i = 0; i < (int)cards.Size(); ++i )
  462. {
  463. rapidjson::Value & v = cards[i];
  464. if ( !v.IsObject() )
  465. {
  466. char szError[1024] = { 0 };
  467. sprintf( szError, "data::cards[%d] is not a object!", i );
  468. Error = szError;
  469. return false;
  470. }
  471. _JS_CARD_ Card;
  472. if ( !v.HasMember( JSON_KEY_CALL_CARD_CARD_ID ) && v[JSON_KEY_CALL_CARD_CARD_ID].IsInt() )
  473. {
  474. Error = "Error, failed to found value: ";
  475. Error += JSON_KEY_CALL_CARD_CARD_ID;
  476. return false;
  477. }
  478. Card.cardid = v[JSON_KEY_CALL_CARD_CARD_ID].GetInt();
  479. if ( !v.HasMember( JSON_KEY_CALL_CARD_CARD_TYPE_ID ) && v[JSON_KEY_CALL_CARD_CARD_TYPE_ID].IsInt() )
  480. {
  481. Error = "Error, failed to found value: ";
  482. Error += JSON_KEY_CALL_CARD_CARD_TYPE_ID;
  483. return false;
  484. }
  485. Card.cardtype = v[JSON_KEY_CALL_CARD_CARD_TYPE_ID].GetInt();
  486. CallCardReq.cards.push_back( Card );
  487. }
  488. return true;
  489. }
  490. }