我正在尝试从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"}
答案 0 :(得分:1)
数组用[
]
字符表示。对象用{
}
个字符表示。
您显示的JSON "person":"{"name":"John", "surname":"Smith"}"
格式错误,因为其中嵌入了太多"
个字符。因此,假设这只是您的错字。
"person":{"name":"John", "surname":"Smith"}
是一个名为person
的单个字段,其值是一个包含两个命名的字符串字段name
和surname
的对象。 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"