c++qtqt5qjsonobject

QJsonObject partial path from variable


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


Solution

  • 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;