【问题标题】:Convert QString to QJsonArray将 QString 转换为 QJsonArray
【发布时间】:2019-12-23 03:36:57
【问题描述】:

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

【问题讨论】:

  • 如果这是string 的完整值,您似乎缺少用{ } 包装它。然后,它变成:"{\"person\":\"{\"name\":\"John\", \"surname\":\"Smith\"}}"
  • 谢谢您,塞尔吉奥,您的回复。我尝试了你的建议,但我仍然得到一个空数组。
  • 一个 doc1.isArray() 检查返回 false。
  • 基于示例,不清楚您在问什么;输入字符串中没有 JSON 数组。
  • 当我使用 fromJson(string.toUtf8(), &error) 时,它说它是 QJsonParseError::UnterminatedObject。

标签: c++ arrays json qt qstring


【解决方案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...

【讨论】:

  • 感谢 Remy 的详细解答。这是有道理的。
【解决方案2】:

试试这个:

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2011-08-21
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多