diff options
-rw-r--r-- | src/corelib/json/qjsondocument.h | 3 | ||||
-rw-r--r-- | src/corelib/json/qjsonparser.cpp | 7 | ||||
-rw-r--r-- | tests/auto/corelib/json/tst_qtjson.cpp | 13 |
3 files changed, 22 insertions, 1 deletions
diff --git a/src/corelib/json/qjsondocument.h b/src/corelib/json/qjsondocument.h index 7eca0302db..e39dc6a27c 100644 --- a/src/corelib/json/qjsondocument.h +++ b/src/corelib/json/qjsondocument.h @@ -67,7 +67,8 @@ struct Q_CORE_EXPORT QJsonParseError IllegalNumber, StringEscapeSequence, StringUTF8Scan, - EndOfString + EndOfString, + MissingObject }; int offset; diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp index a83685da22..b1e6a5a5c7 100644 --- a/src/corelib/json/qjsonparser.cpp +++ b/src/corelib/json/qjsonparser.cpp @@ -244,6 +244,10 @@ bool Parser::parseObject() if (token != ValueSeparator) break; token = nextToken(); + if (token == EndObject) { + lastError = QJsonParseError::MissingObject; + return false; + } } DEBUG << "end token=" << token; @@ -449,6 +453,9 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset) DEBUG << "value: object"; END; return true; + case EndArray: + lastError = QJsonParseError::MissingObject; + return false; default: --json; if (!parseNumber(val, baseOffset)) diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp index 079ff6e76b..87820d2e78 100644 --- a/tests/auto/corelib/json/tst_qtjson.cpp +++ b/tests/auto/corelib/json/tst_qtjson.cpp @@ -120,6 +120,8 @@ private Q_SLOTS: void assignObjects(); void assignArrays(); + + void testTrailingComma(); private: QString testDataDir; }; @@ -1807,5 +1809,16 @@ void TestQtJson::assignArrays() QCOMPARE(inner.at(0).toDouble(), 2.); } +void TestQtJson::testTrailingComma() +{ + const char *jsons[] = { "{ \"Key\": 1, }", "[ { \"Key\": 1 }, ]" }; + + for (unsigned i = 0; i < sizeof(jsons)/sizeof(jsons[0]); ++i) { + QJsonParseError error; + QJsonDocument doc = QJsonDocument::fromJson(jsons[i], &error); + QCOMPARE(error.error, QJsonParseError::MissingObject); + } +} + QTEST_MAIN(TestQtJson) #include "tst_qtjson.moc" |