将 QString 转换为 QJsonArray

Convert QString to QJsonArray

我正在尝试从 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"}

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

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

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

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

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

无论哪种方式,doc1.array() 到 return 都没有数组(doc1.isArray() returns 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...

试试这个:

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"