c++ - 将 JSON 文本文件转换回 QJsonArray

标签 c++ qt qjson qjsonobject

我有一个对象,我使用下面的代码将它序列化为 JSON(另请参阅结构):

struct RegisterItem {
    RegisterType Type = RegisterType::ReadWrite;
    QString Name = QStringLiteral("REGISTER");
    int Bank = 0; 
    int Address = 0;
    int Range = 1;
    int DefaultValue = 0;
    int CurrentValue = 0;
    int SpecialAction = REG_SPECIAL_ACTION_NONE;
};

此代码将其转换为 json 文本文件:

bool saveRegisterStateToFile(const QVector<RegisterWidget*>& widgets)
{
    QJsonArray arr;

    for(int i = 0; i < widgets.size(); i++) {

        RegisterItem item = widgets[i]->registerItem();
        auto data = QJsonObject({

                                    qMakePair(QString("Address"), QJsonValue(item.Address)),
                                    qMakePair(QString("Name"), QJsonValue(item.Name)),
                                    qMakePair(QString("Bank"), QJsonValue(item.Bank)),
                                    qMakePair(QString("Type"), QJsonValue(static_cast<int>(item.Type))),
                                    qMakePair(QString("DefaultValue"), QJsonValue(item.DefaultValue)),
                                    qMakePair(QString("SpecialAction"), QJsonValue(item.SpecialAction))
                                });
        arr.push_back(data);
    }

    QFile file("json.txt");
    file.open(QFile::WriteOnly);
    file.write(QJsonDocument(arr).toJson());
}

一切正常并生成 json 文件...它看起来像这样(前几行):

[
    {
        "Address": 0,
        "Bank": 0,
        "DefaultValue": 0,
        "Name": "V_ADC_IN",
        "SpecialAction": 0,
        "Type": 3
    },
    {
        "Address": 1,
        "Bank": 0,
        "DefaultValue": 0,
        "Name": "V_ADC_SCALE",
        "SpecialAction": 0,
        "Type": 3
    },
    {
        "Address": 2,
        "Bank": 0,

现在,我需要做相反的事情……但我的 json 对象大小始终为 0!有什么问题吗?

QFile file(url);

file.open(QIODevice::ReadOnly | QIODevice::Text);
QString raw = file.readAll();
file.close();

QJsonDocument doc = QJsonDocument::fromJson(raw.toUtf8());
QJsonObject obj = doc.object();
QJsonArray arr = obj[""].toArray();

最佳答案

您的对象没有标识符...因此您需要按数组中的位置进行访问。像这样:

QJsonDocument doc = QJsonDocument::fromJson(raw.toUtf8());
QJsonArray arr = doc.array(); // get array representation of the doc

for(int i = 0; i < arr.size(); i++) {
        QJsonValue val = arr.at(i);
        // The following line should thoritically prin the Name field
        qDebug() << val.toObject().value("Name");
}

关于c++ - 将 JSON 文本文件转换回 QJsonArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522200/

相关文章:

c++ - QFileDialog 预选目录

qt - 错误: Unknown method parameter type: QString&

c++ - 当分配静态指针时,如何使自动完成器识别自动类型变量?

c++ - 如何解析 QString 中的转义序列?

qt - 如何注册以下数据类型以允许序列化?

c# - 指向非托管 C++ 代码的 CLI 指针

c++:堆栈上的数据没有初始化

c++ - 为什么带有自定义删除器的 unique_ptr 不适用于 nullptr,而 shared_ptr 可以?

c++ - 如何在函数中返回一个 const char*?

qt - Ubuntu下在Qt Creator中使用QJson库