QJsonObject частичный путь от переменной

У меня есть объект json, который я загружаю:

QJsonObject json = CommonToolkit::Types::LoadJson(config);

Вот часть содержимого файла json:

{
"config": {
"macos": {
"screen": {
"main": {
"height": 0,
"left": 0,
"top": 0,
"width": 0
}
},
"windows: {
}

Что я делаю, это проверяю, в какой ОС я работаю. Используя следующую переменную для хранения этой ОС:

QString osPath;

В моем тесте osPath = «macos»

Поэтому я хочу обновить геометрию приложений

    QJsonObject jparam{
{ "height", value.height() },
{ "left", value.left() },
{ "width", value.width() },
{ "top", value.top() }
};

Моя проблема, когда я пытаюсь установить jon с jparam, используя osPath:

json["config"][osPath]["screen"]["main"] = jparam;

Я получаю ошибку:

/Users/adviner/Projects/Notes/src/Notes/data/config.cpp:87: ошибка: тип ‘QJsonValueRef’ не предоставляет оператор нижнего индекса
json [«config»] [osPath] [«screen»] [«main»] = jparam;
~~~~~~~~~~~~~~ ^ ~~~~~~

введите описание изображения здесь

0

Решение

Редактирование Json в Qt не простая задача, в этом случае при использовании json["config"] Вы получаете QJsonValueRefэтот класс является помощником для получения других типов элементов, таких как QJsonObject, QJsonArray, int, QStringи т. д., чтобы получить следующий элемент должен быть использован toObject() но это значение является копией, поэтому, если вы измените его, исходный элемент не будет изменен, вам придется переназначить его.

QJsonObject json = CommonToolkit::Types::LoadJson(config);

QString osPath = "macos";

QJsonObject jparam{
{ "height", value.height() },
{ "left", value.left() },
{ "width", value.width() },
{ "top", value.top() }
};

// get objects
QJsonObject config_obj = json["config"].toObject();
QJsonObject osPath_obj = config_obj[osPath].toObject();
QJsonObject screen_obj = osPath_obj["screen"].toObject();

// modify param
screen_obj["main"] = jparam;

// set objects
osPath_obj["screen"] = screen_obj;
config_obj[osPath] = osPath_obj;
json["config"] = config_obj;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]