/****************************************************************************** * FunctionName : jsonparse_object * Description : * Parameters : *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR jsonparse_object(struct jsonparse_state *parser, int *pos, int *len) { *pos = parser->pos; *len = 0; int depth = parser->depth; int json_type = jsonparse_get_type(parser); while (json_type != '}' && parser->depth != depth-1) { json_type = jsonparse_next(parser); } if (json_type == '}') { *len = parser->pos - *pos + 1; } }
/*--------------------------------------------------------------------*/ int jsonparse_next(struct jsonparse_state *state) { char c; char s; skip_ws(state); c = state->json[state->pos]; s = jsonparse_get_type(state); state->pos++; switch(c) { case '{': push(state, c); return c; case '}': if(s == ':' && state->vtype != 0) { /* printf("Popping vtype: '%c'\n", state->vtype); */ pop(state); s = jsonparse_get_type(state); } if(s == '{') { pop(state); } else { state->error = JSON_ERROR_SYNTAX; return JSON_TYPE_ERROR; } return c; case ']': if(s == '[') { pop(state); } else { state->error = JSON_ERROR_UNEXPECTED_END_OF_ARRAY; return JSON_TYPE_ERROR; } return c; case ':': push(state, c); return c; case ',': /* if x:y ... , */ if(s == ':' && state->vtype != 0) { pop(state); } else if(s == '[') { /* ok! */ } else { state->error = JSON_ERROR_SYNTAX; return JSON_TYPE_ERROR; } return c; case '"': if(s == '{' || s == '[' || s == ':') { atomic(state, c = (s == '{' ? JSON_TYPE_PAIR_NAME : c)); } else { state->error = JSON_ERROR_UNEXPECTED_STRING; return JSON_TYPE_ERROR; } return c; case '[': if(s == '{' || s == '[' || s == ':') { push(state, c); } else { state->error = JSON_ERROR_UNEXPECTED_ARRAY; return JSON_TYPE_ERROR; } return c; default: if(s == ':' || s == '[') { if(c <= '9' && c >= '0') { atomic(state, JSON_TYPE_NUMBER); return JSON_TYPE_NUMBER; } } } return 0; }