| @@ -26,6 +26,21 @@ | |||
| class JSONParser | |||
| { | |||
| public: | |||
| static Result parseObjectOrArray (String::CharPointerType t, var& result) | |||
| { | |||
| t = t.findEndOfWhitespace(); | |||
| switch (t.getAndAdvance()) | |||
| { | |||
| case 0: result = var::null; return Result::ok(); | |||
| case '{': return parseObject (t, result); | |||
| case '[': return parseArray (t, result); | |||
| } | |||
| return createFail ("Expected '{' or '['", &t); | |||
| } | |||
| private: | |||
| static Result parseAny (String::CharPointerType& t, var& result) | |||
| { | |||
| t = t.findEndOfWhitespace(); | |||
| @@ -34,7 +49,7 @@ public: | |||
| switch (t2.getAndAdvance()) | |||
| { | |||
| case '{': t = t2; return parseObject (t, result); | |||
| case '[': t = t2; return parseArray (t, result); | |||
| case '[': t = t2; return parseArray (t, result); | |||
| case '"': t = t2; return parseString (t, result); | |||
| case '-': | |||
| @@ -84,7 +99,6 @@ public: | |||
| return createFail ("Syntax error", &t); | |||
| } | |||
| private: | |||
| static Result createFail (const char* const message, const String::CharPointerType* location = nullptr) | |||
| { | |||
| String m (message); | |||
| @@ -483,8 +497,8 @@ private: | |||
| var JSON::parse (const String& text) | |||
| { | |||
| var result; | |||
| String::CharPointerType t (text.getCharPointer()); | |||
| if (! JSONParser::parseAny (t, result)) | |||
| if (! JSONParser::parseObjectOrArray (text.getCharPointer(), result)) | |||
| result = var::null; | |||
| return result; | |||
| @@ -502,8 +516,7 @@ var JSON::parse (const File& file) | |||
| Result JSON::parse (const String& text, var& result) | |||
| { | |||
| String::CharPointerType t (text.getCharPointer()); | |||
| return JSONParser::parseAny (t, result); | |||
| return JSONParser::parseObjectOrArray (text.getCharPointer(), result); | |||
| } | |||
| String JSON::toString (const var& data, const bool allOnOneLine) | |||
| @@ -606,12 +619,12 @@ public: | |||
| expect (JSON::parse (String::empty) == var::null); | |||
| expect (JSON::parse ("{}").isObject()); | |||
| expect (JSON::parse ("[]").isArray()); | |||
| expect (JSON::parse ("1234").isInt()); | |||
| expect (JSON::parse ("12345678901234").isInt64()); | |||
| expect (JSON::parse ("1.123e3").isDouble()); | |||
| expect (JSON::parse ("-1234").isInt()); | |||
| expect (JSON::parse ("-12345678901234").isInt64()); | |||
| expect (JSON::parse ("-1.123e3").isDouble()); | |||
| expect (JSON::parse ("[ 1234 ]")[0].isInt()); | |||
| expect (JSON::parse ("[ 12345678901234 ]")[0].isInt64()); | |||
| expect (JSON::parse ("[ 1.123e3 ]")[0].isDouble()); | |||
| expect (JSON::parse ("[ -1234]")[0].isInt()); | |||
| expect (JSON::parse ("[-12345678901234]")[0].isInt64()); | |||
| expect (JSON::parse ("[-1.123e3]")[0].isDouble()); | |||
| for (int i = 100; --i >= 0;) | |||
| { | |||
| @@ -622,7 +635,7 @@ public: | |||
| const bool oneLine = r.nextBool(); | |||
| String asString (JSON::toString (v, oneLine)); | |||
| var parsed = JSON::parse (asString); | |||
| var parsed = JSON::parse ("[" + asString + "]")[0]; | |||
| String parsedString (JSON::toString (parsed, oneLine)); | |||
| expect (asString.isNotEmpty() && parsedString == asString); | |||
| } | |||