Ejemplo n.º 1
0
Status parseJSON(const fs::path& path, pt::ptree& tree) {
  std::string json_data;
  if (!readFile(path, json_data).ok()) {
    return Status(1, "Could not read JSON from file");
  }

  return parseJSONContent(json_data, tree);
}
int CHttpDataParser::parseBody(const char* header, const char* body, HttpMsgBody& msgBody)
{
	int rc = getHttpBodyLen(header, body, msgBody.len);
	if (rc != Success) return rc;

	parseJSONContent(body, msgBody.paramKey2Value);
	parseKeyToValue(body, msgBody.paramKey2Value);

	return Success;
}
void CHttpDataParser::parseJSONContent(const char* content, ParamKey2Value& paramKey2Value, char separ, bool removeValueSpace, bool removeKeySpace)
{
	if (content == NULL || *content == '\0') return;
	
	// JSON格式,参数名值对解析
	// data format : {"valid":"1","roll":true,"interval":60,"times":4,"msg_code":2000,"msg_desc":"成功"}
	// data format : {"sign":"2eec751c598ec6faf69e89a6aa68ebb4","data":{"failedDesc":"","amount":"0.10","tradeTime":"20151228170406","tradeId":"20151228170358000285","gameId":"617579","payType":"999","attachInfo":"info","orderStatus":"S","orderId":"8.1451293436.1"},"ver":"1.0"}
	const char* keyBegin = NULL;
	const char* keyEnd = NULL;
	const char* valueBegin = NULL;
	char* valueEnd = NULL;
	
	char parseData[MaxRequestDataLen] = {0};
	strncpy(parseData, content, MaxRequestDataLen - 1);
	const unsigned int len = strlen(parseData) - 1;
	
	// if (*parseData == '{' && parseData[len] == '}') parseData[len] = '\0';  // 去掉多余的结束符
	if (*parseData == '{')
	{
	    char* endChr = strrchr(parseData, '}');
		if (endChr != NULL) *endChr = '\0';  // 去掉多余的结束符等
	}
	
	int keyLen = 0;
	int valueLen = 0;
	content = parseData;
	char* separate = (char*)strchr(content, ',');  // 查找名值对分隔符
	int flag = (separate != NULL) ? 1 : -1;        // -1表示只解析一次就结束循环
	if (flag == -1) separate = parseData + len + 1;
	while (flag != 0)
	{
		*separate = '\0';  // 截断当前名值对后面的数据
		keyBegin = strchr(content, separ);
		keyEnd = (keyBegin != NULL) ? strchr(keyBegin + 1, separ) : NULL;
		
		// 先检查是否存在嵌套的对象
		valueBegin = (keyEnd != NULL) ? strchr(keyEnd + 1, '{') : NULL;
		if (valueBegin != NULL)
		{
			*separate = ',';                                                    // 得先还原名值对分隔符才能继续查找对象内容
		    valueEnd = (char*)strchr(valueBegin + 1, '}');                      // 对象的结束位置
			const char* jsonObj = strchr(valueBegin + 1, '{');                  // 下一个json对象
			while (valueEnd != NULL && jsonObj != NULL && jsonObj < valueEnd)   // 继续存在嵌套对象
			{
				valueEnd = (char*)strchr(valueEnd + 1, '}');
				jsonObj = strchr(jsonObj + 1, '{');                             // 下一个json对象
			}
			
			if (valueEnd != NULL)                                // 存在合法的json对象结束符}
			{
				separate = (char*)strchr(++valueEnd, ',');       // 是否还存在其他名值对数据
				*valueEnd = '\0';                                // 截断当前json对象
				parseJSONContent(valueBegin, paramKey2Value, separ, removeValueSpace, removeKeySpace);    // 递归解析当前json对象
				
				if (separate == NULL) break;                     // 没有名值对数据了
				goto CheckFinish;
			}
			*separate = '\0';                                    // 截断当前名值对后面的数据
		}
		
		valueBegin = (keyEnd != NULL) ? strchr(keyEnd + 1, separ) : NULL;
		if (valueBegin != NULL)
		{
			valueEnd = (char*)strchr(valueBegin + 1, separ);
		}
		else if (keyEnd != NULL)
		{
			valueBegin = strchr(keyEnd + 1, ':');
			valueEnd = separate;
		}
		
		if (keyBegin == NULL || keyEnd == NULL || valueBegin == NULL || valueEnd == NULL) break;
		
		// key开始地址及长度
		keyLen = keyEnd - keyBegin - 1;
		++keyBegin;

        // value开始地址及长度
		valueLen = valueEnd - valueBegin - 1;
		++valueBegin;
		
		if (removeValueSpace)
		{
			// 去掉前后多余的空格
			while (valueLen > 0 && *valueBegin == ' ')
			{
				--valueLen;
				++valueBegin;
			}
			while (valueLen > 0 && valueBegin[valueLen - 1] == ' ') --valueLen;
		}
		
		if (removeKeySpace)
		{
			// 去掉前后多余的空格
			while (keyLen > 0 && *keyBegin == ' ')
			{
				--keyLen;
				++keyBegin;
			}
			while (keyLen > 0 && keyBegin[keyLen - 1] == ' ') --keyLen;
		}
		
		paramKey2Value[string(keyBegin, keyLen)] = string(valueBegin, valueLen);
		
		// paramKey2Value[string(keyBegin + 1, keyEnd - keyBegin - 1)] = string(valueBegin + 1, valueEnd - valueBegin - 1);
		if (flag == -1) break;                                 // -1表示只解析一次就结束循环
		
		CheckFinish:
		{
			content = separate + 1;
			separate = (char*)strchr(content, ',');
			flag = (separate != NULL) ? 1 : -1;                // -1表示只解析一次就结束循环
			if (flag == -1) separate = parseData + len;
		}
	}
}