нам нужно изменить существующий быстрый документ 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 возвращает повторное значение, удаленное, но вставленное значение является последним из существующего массива (а не вновь созданного) и, таким образом, заменяет все объекты в массиве тем же самым после нескольких звонков.
Есть идеи, почему этот заказ так важен?