inline ArduinoJson::JsonArray & ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseArray() { // Create an empty array JsonArray &array = _buffer->createArray(); // Check opening braket if (!eat('[')) goto ERROR_MISSING_BRACKET; if (eat(']')) goto SUCCESS_EMPTY_ARRAY; // Read each value for (;;) { // 1 - Parse value JsonVariant value; if (!parseAnythingTo(&value)) goto ERROR_INVALID_VALUE; if (!array.add(value)) goto ERROR_NO_MEMORY; // 2 - More values? if (eat(']')) goto SUCCES_NON_EMPTY_ARRAY; if (!eat(',')) goto ERROR_MISSING_COMMA; } SUCCESS_EMPTY_ARRAY: SUCCES_NON_EMPTY_ARRAY: return array; ERROR_INVALID_VALUE: ERROR_MISSING_BRACKET: ERROR_MISSING_COMMA: ERROR_NO_MEMORY: return JsonArray::invalid(); }
inline ArduinoJson::JsonObject & ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseObject() { // Create an empty object JsonObject &object = _buffer->createObject(); // Check opening brace if (!eat('{')) goto ERROR_MISSING_BRACE; if (eat('}')) goto SUCCESS_EMPTY_OBJECT; // Read each key value pair for (;;) { // 1 - Parse key const char *key = parseString(); if (!key) goto ERROR_INVALID_KEY; if (!eat(':')) goto ERROR_MISSING_COLON; // 2 - Parse value JsonVariant value; if (!parseAnythingTo(&value)) goto ERROR_INVALID_VALUE; if (!object.set(key, value)) goto ERROR_NO_MEMORY; // 3 - More keys/values? if (eat('}')) goto SUCCESS_NON_EMPTY_OBJECT; if (!eat(',')) goto ERROR_MISSING_COMMA; } SUCCESS_EMPTY_OBJECT: SUCCESS_NON_EMPTY_OBJECT: return object; ERROR_INVALID_KEY: ERROR_INVALID_VALUE: ERROR_MISSING_BRACE: ERROR_MISSING_COLON: ERROR_MISSING_COMMA: ERROR_NO_MEMORY: return JsonObject::invalid(); }
JsonVariant parseVariant() { JsonVariant result; parseAnythingTo(&result); return result; }