修复错误的JSON数据

时间:2017-08-25 22:52:12

标签: c++ json algorithm qt serialization

我正在处理从网上下载的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;
}

1 个答案:

答案 0 :(得分:3)

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

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

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

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