QJsonDocument::fromJson无法解析toJson生成的QByteArray问题
QByteArray与QJsonObject双向转换失败的解决方法
将QJsonObject通过QJsonDocument::toJson转为QByteArray后,再用QJsonDocument::fromJson转回QJsonObject时失败,QJsonParseError无错误提示,目标QJsonObject始终为空,尝试Compact格式也无效。
测试代码如下:
QJsonDocument doc, doc2; QJsonParseError jsonerror; QJsonObject original, copy; original.insert("foo", 1); original.insert("bar",2); doc.setObject(original); doc2.fromJson(doc.toJson(), &jsonerror); copy = doc2.object(); qDebug() << doc.toJson(); qDebug() << jsonerror.errorString(); qDebug() << "Null: " << doc2.isNull() << " Object: " << doc2.isObject() << " Array: " << doc2.isArray() << " Empty: " << doc2.isEmpty(); qDebug() << copy.size();
测试输出:
"{\n "bar": 2,\n "foo": 1\n}\n"
"no error occurred"
Null: true Object: false Array: false Empty: true
0
尝试紧凑格式后的输出:
"{"bar":2,"foo":1}"
"no error occurred"
Null: true Object: false Array: false Empty: true
0
问题根源
QJsonDocument::fromJson是静态方法,它不会修改调用该方法的doc2对象,而是返回一个新的QJsonDocument实例。原代码仅调用方法但未接收返回值,导致doc2始终为初始空对象。
修正后的代码
QJsonDocument doc, doc2; QJsonParseError jsonerror; QJsonObject original, copy; original.insert("foo", 1); original.insert("bar",2); doc.setObject(original); // 接收fromJson返回的新QJsonDocument实例 doc2 = QJsonDocument::fromJson(doc.toJson(), &jsonerror); copy = doc2.object(); qDebug() << doc.toJson(); qDebug() << jsonerror.errorString(); qDebug() << "Null: " << doc2.isNull() << " Object: " << doc2.isObject() << " Array: " << doc2.isArray() << " Empty: " << doc2.isEmpty(); qDebug() << copy.size();
修正后的输出
"{\n "bar": 2,\n "foo": 1\n}\n"
"no error occurred"
Null: false Object: true Array: false Empty: false
2
核心说明
QJsonDocument::toJson():将文档内的JSON对象/数组序列化为QByteArray,支持Indented(默认带缩进)和Compact(紧凑无换行)两种格式。QJsonDocument::fromJson():静态解析方法,接收QByteArray与错误指针,解析完成后返回包含JSON内容的新QJsonDocument实例,必须接收该返回值才能获取有效解析结果。
内容的提问来源于stack exchange,提问作者inkms
相关产品推荐
相关产品推荐

