diff --git a/src/blackgui/models/listmodelbase.cpp b/src/blackgui/models/listmodelbase.cpp index a26797df2..2dfd061d0 100644 --- a/src/blackgui/models/listmodelbase.cpp +++ b/src/blackgui/models/listmodelbase.cpp @@ -752,13 +752,15 @@ namespace BlackGui template QJsonObject CListModelBase::toJson() const { - return container().toJson(); + const CVariant variant = CVariant::fromValue(container()); + return variant.toJson(); } template QString CListModelBase::toJsonString(QJsonDocument::JsonFormat format) const { - return container().toJsonString(format); + const CVariant variant = CVariant::fromValue(container()); + return variant.toJsonString(format); } template diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index 82cb50520..6ba375b13 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -1405,10 +1405,22 @@ namespace BlackGui m = CStatusMessage(this).warning("Reading '%1' yields no data") << fileName; break; } + if (!Json::looksLikeSwiftJson(json)) + { + m = CStatusMessage(this).warning("No swift JSON '%1'") << fileName; + break; + } try { - ContainerType container; - container.convertFromJson(json); + CVariant containerVariant; + containerVariant.convertFromJson(Json::jsonObjectFromString(json)); + if (!containerVariant.canConvert()) + { + m = CStatusMessage(this).warning("No valid swift JSON '%1'") << fileName; + break; + } + + ContainerType container = containerVariant.value(); m = this->modifyLoadedJsonData(container); if (m.isFailure()) { break; } // modification error m = this->validateLoadedJsonData(container); @@ -1436,8 +1448,8 @@ namespace BlackGui tr("Save data file"), getDefaultFilename(false), tr("swift (*.json *.txt)")); if (fileName.isEmpty()) { return CStatusMessage(this, CStatusMessage::SeverityDebug, "Save canceled", true); } - const QString json(this->toJsonString()); - bool ok = CFileUtils::writeStringToFileInBackground(json, fileName); + const QString json(this->toJsonString()); // save as CVariant JSON + const bool ok = CFileUtils::writeStringToFileInBackground(json, fileName); if (ok) { return CStatusMessage(this, CStatusMessage::SeverityInfo, "Writing " + fileName + " in progress", true);