diff --git a/src/corelib/json/qjsonwriter.cpp b/src/corelib/json/qjsonwriter.cpp
index 76f62241e34df7a1a8e785008883d1d059842cba..b09c6dd5358aa2570d3d10c8563b57415002fcc2 100644
--- a/src/corelib/json/qjsonwriter.cpp
+++ b/src/corelib/json/qjsonwriter.cpp
@@ -170,7 +170,7 @@ static void valueToJson(const QJsonPrivate::Base *b, const QJsonPrivate::Value &
         json += v.toBoolean() ? "true" : "false";
         break;
     case QJsonValue::Double:
-        json += QByteArray::number(v.toDouble(b));
+        json += QByteArray::number(v.toDouble(b), 'g', 13);
         break;
     case QJsonValue::String:
         json += '"';
diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp
index 6811551769c6eef5a8a6165623f2ea25923ef08c..fc4b3831c4eb61a4f469b0719560d0278816e244 100644
--- a/tests/auto/corelib/json/tst_qtjson.cpp
+++ b/tests/auto/corelib/json/tst_qtjson.cpp
@@ -231,9 +231,54 @@ void tst_QtJson::testNumbers()
         QJsonArray array;
         for (int i = 0; i < n; ++i)
             array.append((double)numbers[i]);
+
+        QByteArray serialized = QJsonDocument(array).toJson();
+        QJsonDocument json = QJsonDocument::fromJson(serialized);
+        QJsonArray array2 = json.array();
+
+        QCOMPARE(array.size(), array2.size());
+        for (int i = 0; i < array.size(); ++i) {
+            QCOMPARE(array.at(i).type(), QJsonValue::Double);
+            QCOMPARE(array.at(i).toDouble(), (double)numbers[i]);
+            QCOMPARE(array2.at(i).type(), QJsonValue::Double);
+            QCOMPARE(array2.at(i).toDouble(), (double)numbers[i]);
+        }
+    }
+
+    {
+        qint64 numbers[] = {
+            0,
+            -1,
+            1,
+            (1UL<<54),
+            (1UL<<55),
+            (1UL<<56),
+            -(1UL<<54),
+            -(1UL<<55),
+            -(1UL<<56),
+            (1UL<<54) - 1,
+            (1UL<<55) - 1,
+            (1UL<<56) - 1,
+            -((1UL<<54) - 1),
+            -((1UL<<55) - 1),
+            -((1UL<<56) - 1)
+        };
+        int n = sizeof(numbers)/sizeof(qint64);
+
+        QJsonArray array;
+        for (int i = 0; i < n; ++i)
+            array.append((double)numbers[i]);
+
+        QByteArray serialized = QJsonDocument(array).toJson();
+        QJsonDocument json = QJsonDocument::fromJson(serialized);
+        QJsonArray array2 = json.array();
+
+        QCOMPARE(array.size(), array2.size());
         for (int i = 0; i < array.size(); ++i) {
             QCOMPARE(array.at(i).type(), QJsonValue::Double);
             QCOMPARE(array.at(i).toDouble(), (double)numbers[i]);
+            QCOMPARE(array2.at(i).type(), QJsonValue::Double);
+            QCOMPARE(array2.at(i).toDouble(), (double)numbers[i]);
         }
     }
 
@@ -242,18 +287,18 @@ void tst_QtJson::testNumbers()
             0,
             -1,
             1,
-            (1<<26),
-            (1<<27),
-            (1<<28),
-            -(1<<26),
-            -(1<<27),
-            -(1<<28),
-            (1<<26) - 1,
-            (1<<27) - 1,
-            (1<<28) - 1,
-            -((1<<26) - 1),
-            -((1<<27) - 1),
-            -((1<<28) - 1),
+            (1UL<<54),
+            (1UL<<55),
+            (1UL<<56),
+            -(1UL<<54),
+            -(1UL<<55),
+            -(1UL<<56),
+            (1UL<<54) - 1,
+            (1UL<<55) - 1,
+            (1UL<<56) - 1,
+            -((1UL<<54) - 1),
+            -((1UL<<55) - 1),
+            -((1UL<<56) - 1),
             1.1,
             0.1,
             -0.1,
@@ -266,9 +311,17 @@ void tst_QtJson::testNumbers()
         QJsonArray array;
         for (int i = 0; i < n; ++i)
             array.append(numbers[i]);
+
+        QByteArray serialized = QJsonDocument(array).toJson();
+        QJsonDocument json = QJsonDocument::fromJson(serialized);
+        QJsonArray array2 = json.array();
+
+        QCOMPARE(array.size(), array2.size());
         for (int i = 0; i < array.size(); ++i) {
             QCOMPARE(array.at(i).type(), QJsonValue::Double);
             QCOMPARE(array.at(i).toDouble(), numbers[i]);
+            QCOMPARE(array2.at(i).type(), QJsonValue::Double);
+            QCOMPARE(array2.at(i).toDouble(), numbers[i]);
         }
     }