将枚举类变量保存到JSON中

时间:2019-03-02 09:08:24

标签: c++ json qt serialization enums

我想以JSON格式保存一些信息。
考虑以下代码段。我在save()方法中出错,其中将类型为enum class的变量分配为QJsonValue

在这种情况下如何使用enum class
谢谢

class MyClass : public QObject
{
    Q_OBJECT

public:
    enum class Status { Undefined, S1, S2 };
    Q_ENUM(Status)

    explicit MyClass(QObject *parent = nullptr);

    void save(QString filename) {
        //...
        QJsonObject jsonObj;
        jsonObj["id"] = m_id;
        jsonObj["status"] = m_status;   //<-- Error: no known conversion from 'MyClass::Status' to 'const QJsonValue' for 1st argument
        //...

        //Save QJsonDocument into target file
    }

private:
    QString m_id;
    MyClass::Status m_status;
    //...
};

注意:如果我将enum class更改为旧的enum,则此代码可以正常工作。但是使用enum class不会被编译。

更多信息:请参阅Qt源中的JSON Save Game Example。它具有一个名为Character的类,并且具有一个名为enum的传统ClassType。尝试将enum更改为enum class。它不会起作用。如何使其正常工作?

2 个答案:

答案 0 :(得分:3)

您可以将enum class转换为QVariant并将其分配给QJsonValue

jsonObj["status"] = QVariant::fromValue(m_status).toJsonValue();

答案 1 :(得分:2)

从这里:https://en.cppreference.com/w/cpp/language/enum

  

尽管可以使用static_cast来获取枚举器的数值,但没有从范围内的枚举器的值到整数类型的隐式转换。

所以这应该起作用:

class MyClass : public QObject
{
    Q_OBJECT

public:
    enum class Status { Undefined, S1, S2 };
    Q_ENUM(Status)

    explicit MyClass(QObject *parent = nullptr);

    void save(QString filename) {
        //...
        QJsonObject jsonObj;
        jsonObj["id"] = m_id;
        jsonObj["status"] = static_cast<int>(m_status);   //<-- Error: no known conversion from 'MyClass::Status' to 'const QJsonValue' for 1st argument
        //...

        //Save QJsonDocument into target file
    }

private:
    QString m_id;
    MyClass::Status m_status;
    //...
};