Trailing comma should result in an error during JSON parsing
authorAlexei Rousskikh <ext-alexei.rousskikh@nokia.com>
Mon, 12 Mar 2012 18:33:39 +0000 (14:33 -0400)
committerQt by Nokia <qt-info@nokia.com>
Mon, 12 Mar 2012 20:38:51 +0000 (21:38 +0100)
1. QJsonParseError::MissingObject defined
2. QJsonDocument::fromJson() will result in defined error after parsing
of something like "{ 'key':1 , }" or "[ {'key':1}, ]"

Change-Id: I8e6234a03b8aca4e5ad6180f273f91066b86d7a1
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
src/corelib/json/qjsondocument.h
src/corelib/json/qjsonparser.cpp
tests/auto/corelib/json/tst_qtjson.cpp

index 7eca030..e39dc6a 100644 (file)
@@ -67,7 +67,8 @@ struct Q_CORE_EXPORT QJsonParseError
         IllegalNumber,
         StringEscapeSequence,
         StringUTF8Scan,
-        EndOfString
+        EndOfString,
+        MissingObject
     };
 
     int        offset;
index a83685d..b1e6a5a 100644 (file)
@@ -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))
index 079ff6e..87820d2 100644 (file)
@@ -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"