BOOL validate_json_structure(uint8 *pU8Buf, uint8 *pU8BufEnd)
{
uint8 aStack[256];
uint8 u8Top = 0;
if(pU8Buf == NULL || pU8BufEnd == NULL) {
return FALSE;
}
/* 去掉前后空格 */
while((*pU8Buf == ' ') && (pU8Buf < pU8BufEnd)) {
pU8Buf++;
}
while((*(pU8BufEnd - 1) == ' ') && (pU8Buf < pU8BufEnd)) {
pU8BufEnd--;
}
if(pU8Buf >= pU8BufEnd) {
return FALSE;
}
/* 第一个和最后一个字符必须是【{】、【}】或者【[】、【]】 */
if (!((*pU8Buf == '{' && *(pU8BufEnd - 1) == '}') || (*pU8Buf == '[' && *(pU8BufEnd - 1) == ']'))) {
return FALSE;
}
BOOL bProcKey = FALSE;
for (; pU8Buf < pU8BufEnd; pU8Buf++) {
/* 跳过转义 */
if ((aStack[u8Top - 1] == '"') && (*pU8Buf == '\\')) {
pU8Buf++;
continue;
}
/* 如果当前状态为处理Key */
if (bProcKey) {
switch (*pU8Buf) {
case '"':
/* 如果栈顶也为【"】,则表示key结束 */
if ((u8Top >= 1) && (aStack[u8Top - 1] == '"')) {
u8Top--;
bProcKey = FALSE;
/* key结束后,第一个字符必须是【:】,并且必须有值 */
if ((*(pU8Buf + 1) != ':') ) {
return FALSE;
}
} else {
if(u8Top >= 255) {
return FALSE;
}
aStack[u8Top++] = *pU8Buf;
}
break;
default:
/* Key必须【"】包起来 */
if(aStack[u8Top - 1] != '"') {
return FALSE;
}
}
} else {
/* 跳过双引号内的内容 */
if ((u8Top >= 1) && (aStack[u8Top - 1] == '"')) {
if (*pU8Buf == '"') {
u8Top--;
}
continue;
}
switch (*pU8Buf) {
case '{':
/* 如果花括号里不为空,则需要先接收key */
if (*(pU8Buf + 1) != '}') {
bProcKey = TRUE;
}
case '[':
/* 除了第一个,括号前必须是【:】或者是【[】 */
if ((u8Top >= 1) && (*(pU8Buf - 1) != ':') && (*(pU8Buf - 1) != '[')) {
return FALSE;
}
case '"':
if(u8Top >= 255) {
return FALSE;
}
aStack[u8Top++] = *pU8Buf;
break;
case ']':
if ((u8Top < 1) || (aStack[--u8Top] != '[')) {
return FALSE;
}
/* 空值,则返回FALSE */
if(*(pU8Buf - 1) == ',') {
return FALSE;
}
break;
case '}':
if ((u8Top < 1) || (aStack[--u8Top] != '{')) {
return FALSE;
}
/* 空项目 or 空值,则返回FALSE */
if(*(pU8Buf - 1) == ',' || *(pU8Buf - 1) == ':') {
return FALSE;
}
break;
case ',':
/* 如果栈顶为花括号,则为一个新项,切换为处理Key状态 */
if ((u8Top < 1) || (aStack[u8Top - 1] == '{')) {
bProcKey = TRUE;
}
/* 空项目 or 空值,则返回FALSE */
if(*(pU8Buf - 1) == ',' || *(pU8Buf - 1) == ':') {
return FALSE;
}
break;
}
}
}
return u8Top == 0;
}