我正在处理从网上下载的JSON数据。这个JSON的问题是它的内容不正确。要在此处显示问题,请进行简化预览:
[
{
"id": 0,
"name": "adsad"
},
{
"id": "123",
"name": "aawew"
}
]
所以有一些这样的项目,其中“id”的某些值是字符串,某处是整数。这是我得到的数据,我无法让源代码修复此问题。
我提出的解决方案是在序列化之前修复这些数据,这是我的天真算法,其中Defaults::intTypes()
是所有键的向量,应该是整数但有时是字符串:
void fixJSONData(QString& data) {
qDebug() << "Fixing JSON data ( thread: " << QThread::currentThreadId() << ")";
QElapsedTimer timer;
timer.start();
for (int i = 0; i < data.size(); ++i) {
for (const auto& key : Defaults::intTypes()) {
if (data.mid(i, key.size() + 3) == "\"" + key + "\":") {
int newLine = i + key.size() + 3;
while (data[newLine] != ',' && data[newLine] != '}') {
if (data[newLine] == '"') {
data.remove(newLine, 1);
} else {
++newLine;
}
}
i = newLine;
break;
}
}
}
qDebug() << "Fixing done in " << timer.elapsed() << " ms.";
}
它确实解决了这个问题,但是算法太慢而且速度太慢(在390秒内经历了450万个字符)。怎么可以更快地完成?
P.S。:对于JSON序列化我使用nlohmann::json库。
编辑:在深入了解JSON规则之后,看起来上面的示例绝对是有效的JSON文件。这应该是与C ++强类型相关的问题,因此它不能将不同元素的数组序列化为C ++类吗?
Edit2:我想从json字符串创建的内容是QVector<Model>
其中:
class Model {
unsigned id;
QString name;
}
答案 0 :(得分:3)
虽然必须有几种方法来改善这种转换,但也许有一种更有效的解决方案。
大多数JSON库允许最终用户为对象定义自定义序列化器/反序列化器。如果您创建自定义反序列化器,那么它可以解析原始数据,您不必修改流或文件。
它不仅更快,而且更优雅。
(如果给定的JSON库不支持自定义反序列化,我会考虑选择另一个。)