From 49d4f46cf1b2d40e4095791d56e3b88eb8f0d0df Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sat, 4 Apr 2026 13:05:33 -0700 Subject: [PATCH] io/fileview: handle deserialization to list properties --- src/io/jsonadapter.cpp | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/io/jsonadapter.cpp b/src/io/jsonadapter.cpp index 6d1f080..369ccbe 100644 --- a/src/io/jsonadapter.cpp +++ b/src/io/jsonadapter.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -260,12 +261,35 @@ void JsonAdapter::deserializeRec(const QJsonObject& json, QObject* obj, const QM } } else { auto variant = jval.toVariant(); + auto convVariant = variant; - if (variant.convert(prop.metaType())) { - prop.write(obj, variant); + if (convVariant.convert(prop.metaType())) { + prop.write(obj, convVariant); } else { - qmlWarning(this) << "Failed to deserialize property " << prop.name() << ": expected " - << prop.metaType().name() << " but got " << jval.toVariant().typeName(); + auto pval = prop.read(obj); + if (variant.canConvert() && pval.canView()) { + auto targetv = QVariant(pval.metaType()); + auto target = targetv.view().metaContainer(); + auto valueType = target.valueMetaType(); + auto i = 0; + + for (QVariant item: variant.value()) { + if (item.convert(valueType)) { + target.addValueAtEnd(targetv.data(), item.constData()); + } else { + qmlWarning(this) << "Failed to deserialize list member " << i << " of property " + << prop.name() << ": expected " << valueType.name() << " but got " + << item.typeName(); + } + + ++i; + } + prop.write(obj, targetv); + } else { + qmlWarning(this) << "Failed to deserialize property " << prop.name() << ": expected " + << prop.metaType().name() << " but got " + << jval.toVariant().typeName(); + } } } }