QJsonObject partial path from variable

385 Views Asked by At

I have a json object that I load:

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

Here is a partial of the json file content:

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

What I do is check what os i'm running in. Using the following variable to store that os:

QString osPath;

In my test osPath = "macos"

So I want to update the applications geometry

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

My problem is when I try to set jon with jparam using osPath:

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

The error I'm getting is:

/Users/adviner/Projects/Notes/src/Notes/data/config.cpp:87: error: type 'QJsonValueRef' does not provide a subscript operator json["config"][osPath]["screen"]["main"] = jparam; ~~~~~~~~~~~~~~^~~~~~~

enter image description here

1

There are 1 best solutions below

1
On BEST ANSWER

Editing a Json in Qt is not a simple task, in this case when using json["config"] you get a QJsonValueRef, this class is a helper to get other types of elements like QJsonObject, QJsonArray, int, QString, etc. by what to get the next element must be used toObject() but this value is a copy, so if you modify it, the initial element will not be modified, you have to reassign it.

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;