jsonBuilder.cpp 17 KB

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