| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 | #include "JsonUtils.h"namespace JsonUtil {	cJSON * obj2json(const JsonType &obj) {		// 创建json根节点;		cJSON * pJsonRoot = NULL;		JsonList jsonList;		JsonMap jsonMap;		JsonVector jsonvec;		switch (obj.type()) {		case JsonType::VoidType:			pJsonRoot = cJSON_CreateNull();			break;		case JsonType::NumberType:			pJsonRoot = cJSON_CreateNumber(obj.toNumber());			break;		case JsonType::BooleanType:			pJsonRoot = cJSON_CreateBool(obj.toBoolean());			break;		case JsonType::StringType:			pJsonRoot = cJSON_CreateString(obj.toString().c_str());			break;		case JsonType::ListType:			jsonList.clear();			jsonList = obj.toList();			pJsonRoot = cJSON_CreateArray();			for (JsonList::const_iterator iter = jsonList.begin();				iter != jsonList.end(); ++iter) {				cJSON_AddItemToArray(pJsonRoot, obj2json(*iter));			}			break;		case JsonType::MapType:			jsonMap.clear();			jsonMap = obj.toMap();			pJsonRoot = cJSON_CreateObject();			for (JsonMap::const_iterator iter = jsonMap.begin();				iter != jsonMap.end(); ++iter) {				cJSON_AddItemToObject(pJsonRoot, iter->first.toString().c_str(), obj2json(iter->second));			}			break;		case JsonType::VectorType:			jsonvec.clear();			jsonvec = obj.toVector();			pJsonRoot = cJSON_CreateArray();			for (JsonVector::const_iterator it = jsonvec.begin(); it != jsonvec.end(); ++it) {				cJSON_AddItemToArray(pJsonRoot, obj2json(*it));			}			break;		default:			break;		}		return pJsonRoot;	}	JsonType json2obj(const cJSON *pJsonRoot) {		// 创建json根节点;		cJSON *pChild = NULL;		JsonList jsonList;		JsonMap jsonMap;		// 解析类型;		if (pJsonRoot) {			switch (pJsonRoot->type) {			case cJSON_NULL:				return JsonType();				break;			case cJSON_False:				return JsonType(false);				break;			case cJSON_True:				return JsonType(true);				break;			case cJSON_Number:				return JsonType(pJsonRoot->valuedouble);				break;			case cJSON_String:				return JsonType(pJsonRoot->valuestring);				break;			case cJSON_Array:				jsonList.clear();				pChild = pJsonRoot->child;				while (pChild) {					jsonList.push_back(json2obj(pChild));					pChild = pChild->next;				}				return JsonType(jsonList);				break;			case cJSON_Object:				jsonMap.clear();				pChild = pJsonRoot->child;				while (pChild) {					jsonMap.insert(JsonMap::value_type(JsonType(pChild->string), json2obj(pChild)));					pChild = pChild->next;				}				return JsonType(jsonMap);				break;			default:				break;			}		}		return JsonType();	}	string objectToString(const JsonType &obj) {		cJSON *pJson = obj2json(obj);		string str;		if (pJson) {			const char *pCh = cJSON_PrintUnformatted(pJson);			if (pCh) {				str = pCh;				free((void*)pCh);			}			cJSON_Delete(pJson);		}		return str;	}	JsonType stringToObject(const string &json) {		cJSON *pJson = cJSON_Parse(json.c_str());		JsonType obj = json2obj(pJson);		if (pJson) {			cJSON_Delete(pJson);		}		return obj;	}}
 |