QJsonDocument :: fromVariant()无法编码QPoint?

时间:2014-02-10 16:32:26

标签: qt5

我想使用内置的Qt 5.2.0功能(Windows7,Qt5.2.0,MinGW4.8)将QVariantMap保存为JSON。 QJsonDocument似乎无法处理QPoint类型,尽管它们已成功编码为QVariant。这是一个例子:

int main()
{
    QPoint point(23, 42);

    QVariantMap settings;
    settings["point"] = point;
    qDebug() << settings;

    QJsonDocument json;
    json = QJsonDocument::fromVariant(settings);

    qDebug() << json;
}

这会产生以下输出:

QMap(("point", QVariant(QPoint, QPoint(23,42) ) ) )  
QJsonDocument({"point": null}) 

point json为什么null?有关内置数据类型的JSON编码有哪些限制?

1 个答案:

答案 0 :(得分:1)

您无法将任何数据类型直接序列化为JSON。你需要做一些手工工作。

例如,要序列化,您可以执行一些简单的操作,例如使用自定义表示法转换为QString

#include <QCoreApplication>
#include <QVariantMap>
#include <QPoint>
#include <QPointF>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>

int main(int argc, char *argv[])
{
    Q_UNUSED(argc)
    Q_UNUSED(argv)

    QPoint point(23, 42);
    //QPointF point(3234.23, 3423.22);
    //QString point = "sdfsdf";

    QVariantMap settings;
    settings["point"] = QString("(%1, %2)").arg(point.x()).arg(point.y());

    QJsonObject jsonobj = QJsonObject::fromVariantMap(settings);
    QJsonDocument json = QJsonDocument(jsonobj);


    qDebug() << settings;
    qDebug() << jsonobj.toVariantMap();
    qDebug() << json;
}

示例结果:

QMap(("point", QVariant(QString, "(23, 42)") ) )  
QMap(("point", QVariant(QString, "(23, 42)") ) )  
QJsonDocument({"point": "(23, 42)"}) 

要反序列化,你需要多做一点,但应该同样容易。

来自JSON Support in Qt

JSON is a format to store structured data. It has 6 basic data types:

* bool
* double
* string
* array
* object
* null