QJsonValue: fix incorrect to{Array,Object} when the value is empty
This is a repeat of commit de6ced66920600e659dbaa2509526a3bcb0b3360 "QCborValue: fix incorrect to{Array,Map} when the value is empty" (6.4), which fixed the same thing for QCborValue. I've just copied the exact same implementation onto the QJsonValue functions. Pick-to: 6.2 6.3 6.4 5.15 Fixes: QTBUG-104085 Change-Id: I175efddd75f24ae59057fffd16f6b257bf7ed36d Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
This commit is contained in:
parent
492b338f57
commit
e114fec62a
@ -119,7 +119,6 @@ QJsonArray::QJsonArray() = default;
|
|||||||
QJsonArray::QJsonArray(QCborContainerPrivate *array)
|
QJsonArray::QJsonArray(QCborContainerPrivate *array)
|
||||||
: a(array)
|
: a(array)
|
||||||
{
|
{
|
||||||
Q_ASSERT(array);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -103,7 +103,6 @@ QJsonObject::QJsonObject() = default;
|
|||||||
QJsonObject::QJsonObject(QCborContainerPrivate *object)
|
QJsonObject::QJsonObject(QCborContainerPrivate *object)
|
||||||
: o(object)
|
: o(object)
|
||||||
{
|
{
|
||||||
Q_ASSERT(o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -708,11 +708,14 @@ QString QJsonValue::toString() const
|
|||||||
*/
|
*/
|
||||||
QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const
|
QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const
|
||||||
{
|
{
|
||||||
const auto dd = QJsonPrivate::Value::container(value);
|
if (!isArray())
|
||||||
const auto n = QJsonPrivate::Value::valueHelper(value);
|
|
||||||
if (value.type() != QCborValue::Array || n >= 0 || !dd)
|
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
|
QCborContainerPrivate *dd = nullptr;
|
||||||
|
const auto n = QJsonPrivate::Value::valueHelper(value);
|
||||||
|
const auto container = QJsonPrivate::Value::container(value);
|
||||||
|
Q_ASSERT(n == -1 || container == nullptr);
|
||||||
|
if (n < 0)
|
||||||
|
dd = container;
|
||||||
return QJsonArray(dd);
|
return QJsonArray(dd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -735,11 +738,14 @@ QJsonArray QJsonValue::toArray() const
|
|||||||
*/
|
*/
|
||||||
QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const
|
QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const
|
||||||
{
|
{
|
||||||
const auto dd = QJsonPrivate::Value::container(value);
|
if (!isObject())
|
||||||
const auto n = QJsonPrivate::Value::valueHelper(value);
|
|
||||||
if (value.type() != QCborValue::Map || n >= 0 || !dd)
|
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
|
QCborContainerPrivate *dd = nullptr;
|
||||||
|
const auto container = QJsonPrivate::Value::container(value);
|
||||||
|
const auto n = QJsonPrivate::Value::valueHelper(value);
|
||||||
|
Q_ASSERT(n == -1 || container == nullptr);
|
||||||
|
if (n < 0)
|
||||||
|
dd = container;
|
||||||
return QJsonObject(dd);
|
return QJsonObject(dd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,15 +768,20 @@ void tst_QtJson::testValueObject()
|
|||||||
void tst_QtJson::testValueArray()
|
void tst_QtJson::testValueArray()
|
||||||
{
|
{
|
||||||
QJsonArray array;
|
QJsonArray array;
|
||||||
|
QJsonArray otherArray = {"wrong value"};
|
||||||
|
QJsonValue value(array);
|
||||||
|
QCOMPARE(value.toArray(), array);
|
||||||
|
QCOMPARE(value.toArray(otherArray), array);
|
||||||
|
|
||||||
array.append(999.);
|
array.append(999.);
|
||||||
array.append(QLatin1String("test"));
|
array.append(QLatin1String("test"));
|
||||||
array.append(true);
|
array.append(true);
|
||||||
|
value = array;
|
||||||
QJsonValue value(array);
|
|
||||||
|
|
||||||
// if we don't modify the original JsonArray, toArray()
|
// if we don't modify the original JsonArray, toArray()
|
||||||
// on the JsonValue should return the same object (non-detached).
|
// on the JsonValue should return the same object (non-detached).
|
||||||
QCOMPARE(value.toArray(), array);
|
QCOMPARE(value.toArray(), array);
|
||||||
|
QCOMPARE(value.toArray(otherArray), array);
|
||||||
|
|
||||||
// if we modify the original array, it should detach
|
// if we modify the original array, it should detach
|
||||||
array.append(QLatin1String("test"));
|
array.append(QLatin1String("test"));
|
||||||
@ -786,14 +791,23 @@ void tst_QtJson::testValueArray()
|
|||||||
void tst_QtJson::testObjectNested()
|
void tst_QtJson::testObjectNested()
|
||||||
{
|
{
|
||||||
QJsonObject inner, outer;
|
QJsonObject inner, outer;
|
||||||
|
QJsonObject otherObject = {{"wrong key", "wrong value"}};
|
||||||
|
QJsonValue v = inner;
|
||||||
|
QCOMPARE(v.toObject(), inner);
|
||||||
|
QCOMPARE(v.toObject(otherObject), inner);
|
||||||
|
|
||||||
inner.insert("number", 999.);
|
inner.insert("number", 999.);
|
||||||
outer.insert("nested", inner);
|
outer.insert("nested", inner);
|
||||||
|
|
||||||
// if we don't modify the original JsonObject, value()
|
// if we don't modify the original JsonObject, value()
|
||||||
// should return the same object (non-detached).
|
// should return the same object (non-detached).
|
||||||
QJsonObject value = outer.value("nested").toObject();
|
QJsonObject value = outer.value("nested").toObject();
|
||||||
|
v = value;
|
||||||
QCOMPARE(value, inner);
|
QCOMPARE(value, inner);
|
||||||
QCOMPARE(value.value("number").toDouble(), 999.);
|
QCOMPARE(value.value("number").toDouble(), 999.);
|
||||||
|
QCOMPARE(v.toObject(), inner);
|
||||||
|
QCOMPARE(v.toObject(otherObject), inner);
|
||||||
|
QCOMPARE(v["number"].toDouble(), 999.);
|
||||||
|
|
||||||
// if we modify the original object, it should detach and not
|
// if we modify the original object, it should detach and not
|
||||||
// affect the nested object
|
// affect the nested object
|
||||||
|
Loading…
x
Reference in New Issue
Block a user