JSON * JSON::parse_array(Lexer *lexer) { JSON *array = new_array(); unsigned int index = 0; if (lexer->end_of_array()) return array; // empty array for (;;) { JSON *item = parse_private(lexer); if (item) array->insert_array_item(index++, item); else { Serial.println(F("missing array item")); break; } Json_Token token = lexer->get_token(); if (token == Array_stop_token) return array; if (token != Comma_token) break; } Serial.println(F("JSON syntax error in array")); return null; }
JSON * JSON::parse(const char *src, Names *table) { Lexer lexer; lexer.src = src; lexer.length = Strings::strlen(src); lexer.table = table; return parse_private(&lexer); }
JSON * JSON::parse(const __FlashStringHelper *src, Names *table) { Lexer lexer; lexer.src = ((char *)src)+PROGMEM_BOUNDARY; lexer.length = Strings::strlen(lexer.src); lexer.table = table; return parse_private(&lexer); }
JSON * JSON::parse(const char *src, unsigned int length, Names *names) { Lexer lexer; lexer.src = (unsigned char *)src; lexer.length = length; lexer.names = names; #ifdef DEBUG PRINT(F("parsing ")); PRINTLN(src); #endif return parse_private(&lexer); }
JSON * JSON::parse_object(Lexer *lexer) { unsigned int symcount = JSON_SYMBOL_BASE; JSON *object = new_object(); Json_Token token = lexer->get_token(); while (token != Error_token) { if (token == Object_stop_token) return object; if (token != String_token) break; unsigned int symbol = lexer->names->get_symbol(lexer->token_src, lexer->token_len, &symcount); token = lexer->get_token(); if (token != Colon_token) break; JSON *value = parse_private(lexer); if (!value) break; object->insert_property(symbol, value); token = lexer->get_token(); if (token == Object_stop_token) continue; if (token != Comma_token) break; token = lexer->get_token(); } // free incomplete object here along with its map from symbols to values #ifdef DEBUG PRINT(F("JSON syntax error in object, token is ")); PRINTLN(token); #endif return null; }
JSON * JSON::parse_object(Lexer *lexer) { JSON *object = new_object(); Json_Token token = lexer->get_token(); while (token != Error_token) { if (token == Object_stop_token) return object; if (token != String_token) break; Symbol symbol = lexer->table->symbol(lexer->token_src, lexer->token_len); token = lexer->get_token(); if (token != Colon_token) break; JSON *value = parse_private(lexer); if (!value) break; object->insert_property(symbol, value); token = lexer->get_token(); if (token == Object_stop_token) continue; if (token != Comma_token) break; token = lexer->get_token(); } // free incomplete object here along with its map from symbols to values Serial.print(F("JSON syntax error in object, token is ")); Serial.println(token); return null; }