fast json - удалить дубликаты объектов в массиве - PullRequest
0 голосов
/ 29 апреля 2020

нам нужно изменить существующий быстрый документ json, который содержит массив объектов таким образом, что, когда новое значение уже присутствует, старое обновляется (фактически стирается, а новое вставляется) , Мы используем следующий код:

std::error_code SensorInputSTN::mUpdateCalib(const rapidjson::Value &val) {

    .....
    const auto& begin = mCalibrationDoc["calibration"].GetArray().Begin();
    const auto& end = mCalibrationDoc["calibration"].GetArray().End();

    std::string newMode = val["mode"].GetString();
    for (rapidjson::Value::ConstValueIterator itr = begin; (itr != end) && (!modeFound);) {
        std::string oldMode = itr->GetObject()["mode"].GetString();
        if (newMode == oldMode) {
            spdlog::trace("Replacing calib data for existing mode {}", newMode);
            //The value MUST be created here, before deleting an item, otherwise is not inserted properly!
            //Deep copy of the value            
            rapidjson::Value v(val, mCalibrationDoc.GetAllocator());
            mCalibrationDoc["calibration"].GetArray().Erase(itr);

            mCalibrationDoc["calibration"].GetArray().PushBack(v, mCalibrationDoc.GetAllocator());
            modeFound = true;
        }
        else {
            ++itr;
        }
    }
    ....

Мы выяснили, что он работает, только если строка

rapidjson::Value v(val, mCalibrationDoc.GetAllocator());

находится перед строкой

itr = mCalibrationDoc["calibration"].GetArray().Erase(itr);

В противном случае mCalibrationDo c возвращает повторное значение, удаленное, но вставленное значение является последним из существующего массива (а не вновь созданного) и, таким образом, заменяет все объекты в массиве тем же самым после нескольких звонков.

Есть идеи, почему этот заказ так важен?

...