JsonUtils.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "JsonUtils.h"
  2. namespace JsonUtil {
  3. cJSON * obj2json(const JsonType &obj) {
  4. // 创建json根节点;
  5. cJSON * pJsonRoot = NULL;
  6. JsonList jsonList;
  7. JsonMap jsonMap;
  8. JsonVector jsonvec;
  9. switch (obj.type()) {
  10. case JsonType::VoidType:
  11. pJsonRoot = cJSON_CreateNull();
  12. break;
  13. case JsonType::NumberType:
  14. pJsonRoot = cJSON_CreateNumber(obj.toNumber());
  15. break;
  16. case JsonType::BooleanType:
  17. pJsonRoot = cJSON_CreateBool(obj.toBoolean());
  18. break;
  19. case JsonType::StringType:
  20. pJsonRoot = cJSON_CreateString(obj.toString().c_str());
  21. break;
  22. case JsonType::ListType:
  23. jsonList.clear();
  24. jsonList = obj.toList();
  25. pJsonRoot = cJSON_CreateArray();
  26. for (JsonList::const_iterator iter = jsonList.begin();
  27. iter != jsonList.end(); ++iter) {
  28. cJSON_AddItemToArray(pJsonRoot, obj2json(*iter));
  29. }
  30. break;
  31. case JsonType::MapType:
  32. jsonMap.clear();
  33. jsonMap = obj.toMap();
  34. pJsonRoot = cJSON_CreateObject();
  35. for (JsonMap::const_iterator iter = jsonMap.begin();
  36. iter != jsonMap.end(); ++iter) {
  37. cJSON_AddItemToObject(pJsonRoot, iter->first.toString().c_str(), obj2json(iter->second));
  38. }
  39. break;
  40. case JsonType::VectorType:
  41. jsonvec.clear();
  42. jsonvec = obj.toVector();
  43. pJsonRoot = cJSON_CreateArray();
  44. for (JsonVector::const_iterator it = jsonvec.begin(); it != jsonvec.end(); ++it) {
  45. cJSON_AddItemToArray(pJsonRoot, obj2json(*it));
  46. }
  47. break;
  48. default:
  49. break;
  50. }
  51. return pJsonRoot;
  52. }
  53. JsonType json2obj(const cJSON *pJsonRoot) {
  54. // 创建json根节点;
  55. cJSON *pChild = NULL;
  56. JsonList jsonList;
  57. JsonMap jsonMap;
  58. // 解析类型;
  59. if (pJsonRoot) {
  60. switch (pJsonRoot->type) {
  61. case cJSON_NULL:
  62. return JsonType();
  63. break;
  64. case cJSON_False:
  65. return JsonType(false);
  66. break;
  67. case cJSON_True:
  68. return JsonType(true);
  69. break;
  70. case cJSON_Number:
  71. return JsonType(pJsonRoot->valuedouble);
  72. break;
  73. case cJSON_String:
  74. return JsonType(pJsonRoot->valuestring);
  75. break;
  76. case cJSON_Array:
  77. jsonList.clear();
  78. pChild = pJsonRoot->child;
  79. while (pChild) {
  80. jsonList.push_back(json2obj(pChild));
  81. pChild = pChild->next;
  82. }
  83. return JsonType(jsonList);
  84. break;
  85. case cJSON_Object:
  86. jsonMap.clear();
  87. pChild = pJsonRoot->child;
  88. while (pChild) {
  89. jsonMap.insert(JsonMap::value_type(JsonType(pChild->string), json2obj(pChild)));
  90. pChild = pChild->next;
  91. }
  92. return JsonType(jsonMap);
  93. break;
  94. default:
  95. break;
  96. }
  97. }
  98. return JsonType();
  99. }
  100. string objectToString(const JsonType &obj) {
  101. cJSON *pJson = obj2json(obj);
  102. string str;
  103. if (pJson) {
  104. const char *pCh = cJSON_PrintUnformatted(pJson);
  105. if (pCh) {
  106. str = pCh;
  107. free((void*)pCh);
  108. }
  109. cJSON_Delete(pJson);
  110. }
  111. return str;
  112. }
  113. JsonType stringToObject(const string &json) {
  114. cJSON *pJson = cJSON_Parse(json.c_str());
  115. JsonType obj = json2obj(pJson);
  116. if (pJson) {
  117. cJSON_Delete(pJson);
  118. }
  119. return obj;
  120. }
  121. }