将 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
的字段,其值是一个包含两个命名字符串字段 name
和 surname
的对象。 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"
我正在尝试从 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
的字段,其值是一个包含两个命名字符串字段 name
和 surname
的对象。 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"