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; } } }