Details
-
Suggestion
-
Resolution: Invalid
-
Not Evaluated
-
None
-
5.15.0
-
None
Description
I'm having trouble with QJsonDocument::fromVariant() is not handling arrays as expected:
QVariantMap map; QVariant list; QList<QVariantMap> letters { {{"a",1}}, {{"b",2}}, {{"c",3}} }; list.setValue(letters); map["err"] = QVariant(); // null map["letters"] = list; qDebug() << QJsonDocument::fromVariant(map).toJson(QJsonDocument::Compact);
Output:
{"err":null,"letters":null}I'm expecting:
{"err":null,"letters":[
,{"b": 2},{"c": 3}]}
However using below, it works:
QVariantList letters { QVariantMap {{"a",1}}, QVariantMap {{"b",2}}, QVariantMap {{"c",3}} };
Ideally, What I'd like to be able to write is:
QVariantMap map { {"err", QVariant()}, {"letters", QList<QVariantMap> { {{"a",1}}, {{"b",2}}, {{"c",3}} }} };
Which doesn't include repeated type information for each item (because it is specified in the template) But that won't compile, so I attempted a hack:
QVariant list; list.setValue(letters); QVariantMap map { {"err", QVariant()}, {"letters", list} };
In which case it silently fails to convert.
While not every QList template instantiation can be known, the common ones should be supported. This becomes important when expressing structures that end up as CBOR or JSON output, or in-memory databases.
Someone on the mailing list said:
I guess our system could detect QList<QVariant> as QVariantList and
QList<QString> as QStringList. They should be binary identical anyway.
I don't know if there is a need for another class QVariantMapList, to hold a list of QVariantMaps, but once should be able to:
QVariantMap map { {"err", QVariant()}, {"letters", QVariantMapList { {{"a",1}}, {{"b",2}}, {{"c",3}} }} };
Which would be the next best thing if it can't be supported though automatic detection. But once this is in place, expressing these structures would be almost as easy as specifying them in JS/JSON.