diff options
3 files changed, 49 insertions, 10 deletions
diff --git a/src/corelib/serialization/qjsoncbor.cpp b/src/corelib/serialization/qjsoncbor.cpp index 000008db50..8bb04fa3bf 100644 --- a/src/corelib/serialization/qjsoncbor.cpp +++ b/src/corelib/serialization/qjsoncbor.cpp @@ -280,11 +280,9 @@ QJsonValue qt_convertToJson(QCborContainerPrivate *d, qsizetype idx) return qt_convertToJson(e.flags & Element::IsContainer ? e.container : nullptr, -e.type); case QCborValue::Null: - return QJsonValue(); - case QCborValue::Undefined: case QCborValue::Invalid: - return QJsonValue::Undefined; + return QJsonValue(); case QCborValue::False: return false; @@ -375,6 +373,8 @@ QJsonValue QCborValue::toJsonValue() const return true; case Null: + case Undefined: + case Invalid: return QJsonValue(); case Double: @@ -383,10 +383,6 @@ QJsonValue QCborValue::toJsonValue() const case SimpleType: break; - case Undefined: - case Invalid: - return QJsonValue::Undefined; - case ByteArray: case String: // empty strings diff --git a/tests/auto/corelib/serialization/json/tst_qtjson.cpp b/tests/auto/corelib/serialization/json/tst_qtjson.cpp index cfe70932b3..abe1b069e7 100644 --- a/tests/auto/corelib/serialization/json/tst_qtjson.cpp +++ b/tests/auto/corelib/serialization/json/tst_qtjson.cpp @@ -1346,6 +1346,7 @@ void tst_QtJson::fromVariant_data() variantList.append(stringValue); variantList.append(stringList); variantList.append(QVariant::fromValue(nullptr)); + variantList.append(QVariant()); QJsonArray jsonArray_variant; jsonArray_variant.append(boolValue); jsonArray_variant.append(floatValue); @@ -1353,23 +1354,31 @@ void tst_QtJson::fromVariant_data() jsonArray_variant.append(stringValue); jsonArray_variant.append(jsonArray_string); jsonArray_variant.append(QJsonValue(QJsonValue::Null)); + jsonArray_variant.append(QJsonValue()); QVariantMap variantMap; variantMap["bool"] = boolValue; variantMap["float"] = floatValue; variantMap["string"] = stringValue; variantMap["array"] = variantList; + variantMap["null"] = QVariant::fromValue(nullptr); + variantMap["default"] = QVariant(); QVariantHash variantHash; variantHash["bool"] = boolValue; variantHash["float"] = floatValue; variantHash["string"] = stringValue; variantHash["array"] = variantList; + variantHash["null"] = QVariant::fromValue(nullptr); + variantHash["default"] = QVariant(); QJsonObject jsonObject; jsonObject["bool"] = boolValue; jsonObject["float"] = floatValue; jsonObject["string"] = stringValue; jsonObject["array"] = jsonArray_variant; + jsonObject["null"] = QJsonValue::Null; + jsonObject["default"] = QJsonValue(); + QTest::newRow("default") << QVariant() << QJsonValue(QJsonValue::Null); QTest::newRow("nullptr") << QVariant::fromValue(nullptr) << QJsonValue(QJsonValue::Null); QTest::newRow("bool") << QVariant(boolValue) << QJsonValue(boolValue); QTest::newRow("int") << QVariant(intValue) << QJsonValue(intValue); @@ -1385,13 +1394,47 @@ void tst_QtJson::fromVariant_data() QTest::newRow("variantHash") << QVariant(variantHash) << QJsonValue(jsonObject); } +// replaces QVariant() with QVariant(nullptr) +static QVariant normalizedVariant(const QVariant &v) +{ + switch (v.userType()) { + case QMetaType::UnknownType: + return QVariant::fromValue(nullptr); + case QMetaType::QVariantList: { + const QVariantList in = v.toList(); + QVariantList out; + out.reserve(in.size()); + for (const QVariant &v : in) + out << normalizedVariant(v); + return out; + } + case QMetaType::QVariantMap: { + const QVariantMap in = v.toMap(); + QVariantMap out; + for (auto it = in.begin(); it != in.end(); ++it) + out.insert(it.key(), normalizedVariant(it.value())); + return out; + } + case QMetaType::QVariantHash: { + const QVariantHash in = v.toHash(); + QVariantHash out; + for (auto it = in.begin(); it != in.end(); ++it) + out.insert(it.key(), normalizedVariant(it.value())); + return out; + } + + default: + return v; + } +} + void tst_QtJson::fromVariant() { QFETCH( QVariant, variant ); QFETCH( QJsonValue, jsonvalue ); QCOMPARE(QJsonValue::fromVariant(variant), jsonvalue); - QCOMPARE(variant.toJsonValue(), jsonvalue); + QCOMPARE(normalizedVariant(variant).toJsonValue(), jsonvalue); } void tst_QtJson::fromVariantSpecial_data() @@ -1424,7 +1467,7 @@ void tst_QtJson::toVariant() QFETCH( QVariant, variant ); QFETCH( QJsonValue, jsonvalue ); - QCOMPARE(jsonvalue.toVariant(), variant); + QCOMPARE(jsonvalue.toVariant(), normalizedVariant(variant)); } void tst_QtJson::fromVariantMap() diff --git a/tests/auto/corelib/serialization/qcborvalue_json/tst_qcborvalue_json.cpp b/tests/auto/corelib/serialization/qcborvalue_json/tst_qcborvalue_json.cpp index 76f2bb924a..eeeec9b67f 100644 --- a/tests/auto/corelib/serialization/qcborvalue_json/tst_qcborvalue_json.cpp +++ b/tests/auto/corelib/serialization/qcborvalue_json/tst_qcborvalue_json.cpp @@ -89,7 +89,7 @@ void tst_QCborValue_Json::toVariant_data() }; // good JSON matching: - add(QCborValue(), QVariant(), QJsonValue::Undefined); + add(QCborValue(), QVariant(), QJsonValue::Null); add(nullptr, QVariant::fromValue(nullptr), QJsonValue::Null); add(false, false, false); add(true, true, true); |