为何QJsonArray会出现额外的数组嵌套层级?
QJsonObject读取JSON数组时出现额外嵌套的问题
问题现象
给定如下JSON数据:
{ "high_scores": [ { "name": "Homer", "score": 1601 }, { "name": "Bart", "score": 1492 } ], "an_item": "Simpson", "another_item": 20 }
将其加载到QJsonObject后,访问an_item和another_item均正常,但读取high_scores数组时出现异常:
- 无论用
const QJsonArray array{obj["high_scores"]};还是const QJsonArray array{obj["high_scores"].toArray()};获取数组,调试器中显示数组存在额外嵌套:array <1 items> [0] <2 items> [0] <2 items> [1] <2 items> - 必须通过
QJsonObject elem{array[0][ndx].toObject()};(多一层[0])才能访问到预期的元素。
核心原因
最可能的情况是你代码中实际加载的JSON数据,和你贴出的结构不一致——大概率high_scores字段被额外包裹了一层数组,实际JSON结构类似:
{ "high_scores": [ [ {"name": "Homer", "score": 1601}, {"name": "Bart", "score": 1492} ] ], "an_item": "Simpson", "another_item": 20 }
这种情况下,读取出来的数组自然会出现嵌套结构。
其次需要排查JSON加载代码是否存在逻辑错误:比如解析过程中是否不小心将high_scores的数组又包装了一次,例如错误地执行了类似QJsonArray array = QJsonArray({obj["high_scores"].toArray()});的代码。
解决方案
- 验证实际加载的JSON内容:在代码中加入输出,确认加载后的JSON结构是否符合预期:
qDebug() << QJsonDocument(obj).toJson(QJsonDocument::Indented);
通过输出可以直观看到high_scores是否存在多余的嵌套。
修正源头问题:
- 如果是原始JSON的问题,直接修改JSON结构,去掉
high_scores外层的多余数组; - 如果是加载代码的问题,检查解析逻辑,避免对数组进行重复包装。
- 如果是原始JSON的问题,直接修改JSON结构,去掉
临时补救方案(不推荐,仅用于无法修改JSON/代码的场景):如果必须处理现有嵌套结构,可以先取出内层数组再访问:
QJsonArray actualArray = obj["high_scores"].toArray().first().toArray(); QJsonObject elem = actualArray[ndx].toObject();
内容的提问来源于stack exchange,提问作者jkb
相关产品推荐
相关产品推荐

