将QString转换为QJsonArray

时间:2019-08-16 20:48:50

标签: c++ arrays json qt qstring

我正在尝试从QString获取数组。

我在线上获得了将字符串转换为QJsonDocument的建议,但是,我的数组为空。

QString string = "\"person\":\"{\"name\":\"John\", \"surname\":\"Smith\"}";
QJsonDocument doc1 = QJsonDocument::fromJson(string.toUtf8());

QJsonArray array = doc1.array();

预期结果是获取一个QJsonValues数组(一个QJsonArray):

array[0] : {"name":"John"},
array[1] : {"surname":"Smith"}

2 个答案:

答案 0 :(得分:1)

显示的JSON字符串中没有数组。

数组用[ ]字符表示。对象用{ }个字符表示。

您显示的JSON "person":"{"name":"John", "surname":"Smith"}"格式错误,因为其中嵌入了太多"个字符。因此,假设这只是您的错字。

"person":{"name":"John", "surname":"Smith"}是一个名为person的单个字段,其值是一个包含两个命名的字符串字段namesurname的对象。 QJsonDocument无法按原样解析,因为它期望JSON是对象或数组。

{"person":{"name":"John", "surname":"Smith"}}是一个未命名的对象,包含相同类型的person字段。 doc1.isObject()为此返回true。

无论哪种方式,都没有doc1.array()返回的数组(doc1.isArray()返回false)。因此,如果要从这些数据中获取数组,则必须自己创建它,例如:

QString string = "{\"person\":{\"name\":\"John\", \"surname\":\"Smith\"}}";
QJsonDocument doc1 = QJsonDocument::fromJson(string.toUtf8());
if (!doc1.isObject()) {
    // handle parse error...
}

QJsonValue &person = doc1["person"];
if (person.isUndefined()) {
    // key "person" does not exist...
}


// creates an array of strings:
// array[0] = "John"
// array[1] = "Smith"
QJsonArray array = {
    person["name"],
    person["surname"]
};

or

// creates an array of objects:
// array[0] = {"name":"John"}
// array[1] = {"surname":"Smith"}
QJsonArray array = {
    QJsonObject({"name", person["name"]}),
    QJsonObject({"surname", person["surname"]})
};

// use array as needed...

答案 1 :(得分:0)

尝试一下:

QString string = "{\"person\":{\"name\":\"John\", \"surname\":\"Smith\"}}";

QJsonDocument doc = QJsonDocument::fromJson(string.toUtf8());
QJsonObject json = doc.object();

QJsonArray jsonArray;

foreach(const QString& key, json.keys()) {

        QJsonObject Obj = json.value(key).toObject();

        foreach(const QString& key, Obj.keys()) {

            QJsonObject newObj;
            newObj[key] = Obj.value(key).toString();
            jsonArray.push_back(newObj);

        }
    }

qDebug() << "JSONARRAY" << jsonArray << endl;

// TO ACCESS YOUR ARRAY

for(int i = 0; i<jsonArray.size(); i++) {

    QJsonObject person = jsonArray.at(i).toObject();

    qDebug() << person;
}

输出:

JSONARRAY QJsonArray([{"name":"John"},{"surname":"Smith"}]) 

QJsonObject({"name":"John"})
QJsonObject({"surname":"Smith"})

但是我建议您将名称和姓氏保留在一个对象中,以便您可以像下面这样正确地访问和管理它:

QString string = "{\"person\":{\"name\":\"John\", \"surname\":\"Smith\"}}";

QJsonDocument doc = QJsonDocument::fromJson(string.toUtf8());
QJsonObject json = doc.object();

QJsonArray jsonArray;

foreach(const QString& key, json.keys()) {

        QJsonObject Obj = json.value(key).toObject();
        jsonArray.push_back(Obj);
    }

qDebug() << "JSONARRAY" << jsonArray << endl;

// TO ACCESS YOUR ARRAY

for(int i = 0; i<jsonArray.size(); i++) {

    QJsonObject person = jsonArray.at(i).toObject();

    qDebug() << person << endl;
    qDebug() << "name: " << person.value("name").toString() << endl;
    qDebug() << "surname: "<< person.value("surname").toString() << endl;

}

输出:

JSONARRAY QJsonArray([{"name":"John","surname":"Smith"}]) 

QJsonObject({"name":"John","surname":"Smith"}) 

name:  "John" 

surname:  "Smith"