Документация на класс QJsonObject гласит, что разницы между методами нет:
QJsonValue QJsonObject::operator[](const QString & key) const
Returns a QJsonValue representing the value for the key key.
This does the same as value().
The returned QJsonValue is QJsonValue::Undefined if the key does not exist.
Однако, при рефракторинге своего старого кода, я обнаружил, что это не так. Вот пример кода и результат выполнения, демонстрирующий различие:
QJsonObject test; test["entry"] = 42;
qDebug() << "Exists key:";
qDebug() << " - undef? " << test["entry"].isUndefined();
qDebug() << " - null? " << test["entry"].isNull();
qDebug() << " - vundef? " << test.value("entry").isUndefined();
qDebug() << " - vnull? " << test.value("entry").isNull();
qDebug() << "Non exists key (operatopr[] first):";
qDebug() << " - undef? " << test["entry_1"].isUndefined();
qDebug() << " - null? " << test["entry_1"].isNull();
qDebug() << " - vundef? " << test.value("entry_1").isUndefined();
qDebug() << " - vnull? " << test.value("entry_1").isNull();
qDebug() << "Non exists key (value() first):";
qDebug() << " - vundef? " << test.value("entry_2").isUndefined();
qDebug() << " - vnull? " << test.value("entry_2").isNull();
// Here undefined key will be created with a null value
qDebug() << " - undef? " << test["entry_2"].isUndefined();
qDebug() << " - null? " << test["entry_2"].isNull();
qDebug() << " - vundef? " << test.value("entry_2").isUndefined();
qDebug() << " - vnull? " << test.value("entry_2").isNull();
Exists key:
- undef? false
- null? false
- vundef? false
- vnull? false
Non exists key (operatopr[] first):
- undef? false
- null? true
- vundef? false
- vnull? true
Non exists key (value() first):
- vundef? true
- vnull? false
- undef? false
- null? true
- vundef? false
- vnull? true
До обращения к несуществующему ключу через оператор [] он действительно считается неопределенным (undefined) и при этом не является нулевым (null), после такого обращения он уже считается определенным и его значение null. При этом в документации указано, что обращение по value() и [] равнозначны и должны возвращать undefined, если ключа нет.
Воспроизводится ли этот баг у вас? Версия Qt 5.5.