【发布时间】:2017-08-25 22:52:12
【问题描述】:
我正在处理从网络下载的 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;
}
【问题讨论】:
-
那个 JSON 文件到底有什么问题?
nlohmann::json::parse似乎正确处理了您的示例。 -
对于
Defaults::intTypes()中的每个条目,您的算法不必要地查看几乎每一行的几乎每个字符一次。如果您要假设一行中不超过一个字段名称,则应处理每一行一次以提取字段名称(如果有),并查看它是否在整数类型集中。跨度>
标签: c++ json algorithm qt serialization