You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:51:16