QJsonObject частичный путь от переменной - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть объект 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;~~~~~~~~~~~~~~ ^ ~~~~~~

enter image description here

1 Ответ

0 голосов
/ 30 сентября 2018

Редактирование 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;
...