Lily
Lily

Reputation: 152

How to change values in a json file?

I have the following JSON-file :

{
    "users":[
        {"nom":"123",
        "name":"John",
        "family":"ala",
        "cash":1000
    }
    ,{"nom":"456",
        "name":"Joe",
        "family":"ala",
        "cash":1000
    }
    ,{"nom":"131",
        "name":"David",
        "family":"ala",
        "cash":1000
    }]
}

I would like to change John's cash.

This is how I am trying to achieve this:

 QFile f("file address ...");
     f.open(QIODevice::ReadOnly|QIODevice::Text|QIODevice::WriteOnly);
       QByteArray b=f.readAll();
       QJsonDocument d=QJsonDocument::fromJson(b);
       QJsonObject o=d.object();

       for (int i=0;i<o["users"].toArray().size();i++) {
          if(o["users"].toArray()[i].toObject()["name"].toString()=="John")
          o["users"].toArray()[i].toObject()["cash"].toInt()=2000;//error unable to assign
            }

However, I am getting the following error:

error: unable to assign

How to fix this?

Upvotes: 1

Views: 1609

Answers (1)

scopchanov
scopchanov

Reputation: 8399

Cause

You get the error, because you are trying to assign a value to the return value of a function (QJsonValue::toInt in this case).

Solution

Assign the value to QJsonValue, as demonstrated in the JSON Save Game Example:

void Character::write(QJsonObject &json) const
{
    json["name"] = mName;
    json["level"] = mLevel;
    json["classType"] = mClassType;
}

Example

Here is an example I have written for you, in order to demonstrate how your code could be changed to implement the proposed solution:

#include <QApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFile file("data.json");

    if (file.open(QFile::ReadOnly | QFile::Text)) {
        QJsonObject json = QJsonDocument::fromJson(file.readAll()).object();
        QJsonArray users = json["users"].toArray();

        file.close();

        for (auto user : users) {
            QJsonObject userObj = user.toObject();

            if (userObj["name"].toString() == "John")
                userObj["cash"] = 2000;

            user = userObj;
        }

        qDebug() << users;
    }

    return a.exec();
}

Result

The given example produces the following result:

QJsonArray([{"cash":2000,"family":"ala","name":"John","nom":"123"},{"cash":1000,"family":"ala","name":"Joe","nom":"456"},{"cash":1000,"family":"ala","name":"David","nom":"131"}])

Please note, that the cash for John is set to 2000.

Upvotes: 3

Related Questions