ConstStar
发布于 2025-05-07 / 3 阅读 / 0 评论 / 0 点赞

简单JSON格式验证代码

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

评论