修复错误的 JSON 数据

Fixing wrong JSON data

本文关键字:JSON 数据 错误      更新时间:2023-10-16

我正在使用从网络下载的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万个字符(。如何才能更快地完成这项工作?

PS:对于JSON序列化,我使用nlohmann::json库。

编辑:在深入了解JSON规则后,看起来上面的示例是绝对有效的JSON文件。这是否应该是一个与C++强类型相关的问题,因此它无法将不同元素的数组序列化为C++类?

编辑2:我想从该json字符串创建的是QVector<Model>

class Model {
unsigned id;
QString name;
}

尽管必须有几种方法来改善这种转换,但也许有一个更有效的解决方案。

大多数 JSON 库允许最终用户为对象定义自定义序列化程序/反序列化程序。如果创建自定义反序列化程序,则它可以解析原始数据,而不必修改流或文件。

它不仅更快,而且更优雅。

(如果给定的 JSON 库不支持自定义反序列化,我会考虑选择另一个。