diff --git a/src/windeployqt/utils.h b/src/windeployqt/utils.h
index 8a520c7e1438e12d59c45a8c6868bac4d487b3c1..f184b514e6b1f4f26a0f9d057aa805c79bc7725b 100644
--- a/src/windeployqt/utils.h
+++ b/src/windeployqt/utils.h
@@ -95,27 +95,43 @@ inline std::wostream &operator<<(std::wostream &str, const QString &s)
 // Container class for JSON output
 class JsonOutput
 {
+    typedef QPair<QString, QString> SourceTargetMapping;
+    typedef QList<SourceTargetMapping> SourceTargetMappings;
+
 public:
     void addFile(const QString &source, const QString &target)
     {
-        QJsonObject object;
-        object.insert(QStringLiteral("source"), QDir::toNativeSeparators(source));
-        object.insert(QStringLiteral("target"), QDir::toNativeSeparators(target));
-        m_files.append(object);
+        m_files.append(SourceTargetMapping(source, target));
     }
+
+    void removeTargetDirectory(const QString &targetDirectory)
+    {
+        for (int i = m_files.size() - 1; i >= 0; --i) {
+            if (m_files.at(i).second == targetDirectory)
+                m_files.removeAt(i);
+        }
+    }
+
     QByteArray toJson() const
     {
         QJsonObject document;
-        document.insert(QStringLiteral("files"), m_files);
+        QJsonArray files;
+        foreach (const SourceTargetMapping &mapping, m_files) {
+            QJsonObject object;
+            object.insert(QStringLiteral("source"), QDir::toNativeSeparators(mapping.first));
+            object.insert(QStringLiteral("target"), QDir::toNativeSeparators(mapping.second));
+            files.append(object);
+        }
+        document.insert(QStringLiteral("files"), files);
         return QJsonDocument(document).toJson();
     }
     QByteArray toList(ListOption option, const QDir &base) const
     {
         QByteArray list;
-        foreach (const QJsonValue &file, m_files) {
-            const QString source = file.toObject().value(QStringLiteral("source")).toString();
-            const QString fileName = QFileInfo(source).fileName();
-            const QString target = file.toObject().value(QStringLiteral("target")).toString() + QDir::separator() + fileName;
+        foreach (const SourceTargetMapping &mapping, m_files) {
+            const QString source = QDir::toNativeSeparators(mapping.first);
+            const QString fileName = QFileInfo(mapping.first).fileName();
+            const QString target = QDir::toNativeSeparators(mapping.second) + QDir::separator() + fileName;
             switch (option) {
             case ListNone:
                 break;
@@ -136,7 +152,7 @@ public:
         return list;
     }
 private:
-    QJsonArray m_files;
+    SourceTargetMappings m_files;
 };
 
 #ifdef Q_OS_WIN
@@ -295,6 +311,8 @@ bool updateFile(const QString &sourceFileName,
                             .arg(QDir::toNativeSeparators(targetFileName));
                     return false;
                 }
+                if (json)
+                    json->removeTargetDirectory(targetFileName);
             }
         }
         return true;