#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonValue>
#include <QJsonObject>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char json[] = "{ id: 12}";
QJsonDocument doc = QJsonDocument::fromJson(json);
QJsonValue v = doc.object()["no-defined"];
Q_ASSERT(v.isUndefined()); // assert failed.
return a.exec();
}
我想用QJsonValue::isUndefined()
来判断我是否定义了键,但在测试代码中,v.isUndefined()
返回 false,而不是 true。我不知道原因,有什么解释吗?
运行测试后:
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char json[] = "{ id: 12}";
QJsonDocument doc = QJsonDocument::fromJson(json);
QJsonValue v_ar = doc.object()["no-defined"];
QJsonValue v_o = doc.object().value(QString("no-defined"));
qDebug() << "Array-operator:" << v_ar.isUndefined() << v_ar.toString() << v_ar.type(); //returns: false ""
qDebug() << "Object-operator:" << v_o.isUndefined() << v_o.toString(); //returns true ""
qDebug() << "direct object call:" << doc.object().value("no-defined").isUndefined() << doc.object().value("no-defined").toString(); //returns true ""
qDebug() << "direct array call:" << doc.object()["no-defined"].isUndefined() << doc.object()["no-defined"].toString(); //returns false ""
return a.exec();
}
这导致:
Array-operator: false "" 0
Object-operator: true ""
direct object call: true ""
direct array call: false ""
您可以看到数组运算符有问题。它不返回 JsonValue::Undefined,而是返回 JsonValue::NULL (0(。一种解决方法是使用
QJsonValue v = doc.object().value("no-defined");
或更好:
Q_ASSERT(doc.object().value("no-defined").isUndefined());
根据QT-BUG的说法,它的意思是这样的。如果调用数组运算符,则会创建一个默认值为 NULL 的新项。