У меня есть объект, который я сериализовал в 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");
}
Других решений пока нет …