diff --git a/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc b/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc
index aa47925ca8d1e114375c2024eaef8faec3b75ef2..b465093754d4fa0cf412182ce733eb34bdc1ff10 100644
--- a/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc
+++ b/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc
@@ -1,4 +1,5 @@
 #include "../CRTPSubDocument.hh"
+#include "../../JsonBuilder.hh"
 
 using namespace Vivy;
 
@@ -32,17 +33,13 @@ AssSubDocument::getStyles() const noexcept
 QJsonDocument
 AssSubDocument::getProperties() const noexcept
 {
-    QJsonDocument ret;
-
     QJsonObject styleObject;
     for (const Ass::StylePtr &style : styles) {
         styleObject.insert(style->getElementName(), style->getProperties().object());
     }
 
-    QJsonObject object{
-        { "Styles", styleObject },
+    return JsonBuilder::createOrderedJsonDocument({
         { "File", filePath },
-    };
-    ret.setObject(object);
-    return ret;
+        { "Styles", styleObject },
+    });
 }
diff --git a/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc b/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
index c26b99e424aa7b0c06efebd3f79628a11262b0dc..c91c3752109af9df968d21d46d32ca433557c1b9 100644
--- a/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
+++ b/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
@@ -1,4 +1,5 @@
 #include "../CRTPSubDocument.hh"
+#include "../../JsonBuilder.hh"
 
 using namespace Vivy;
 
@@ -22,11 +23,8 @@ AudioSubDocument::getElementName() const noexcept
 QJsonDocument
 AudioSubDocument::getProperties() const noexcept
 {
-    QJsonDocument ret;
-    QJsonObject object{
-        { "Audio context", contextPtr->getProperties().object() },
+    return JsonBuilder::createOrderedJsonDocument({
         { "File", filePath },
-    };
-    ret.setObject(object);
-    return ret;
+        { "Audio context", contextPtr->getProperties().object() },
+    });
 }
diff --git a/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc b/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc
index 085131abdd7353a3f5b61434a4efb75c5aa4201d..6f837e9c219e4747f71100191cad27c9298f102e 100644
--- a/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc
+++ b/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc
@@ -1,4 +1,5 @@
 #include "../CRTPSubDocument.hh"
+#include "../../JsonBuilder.hh"
 
 using namespace Vivy;
 
@@ -22,11 +23,8 @@ VideoSubDocument::getElementName() const noexcept
 QJsonDocument
 VideoSubDocument::getProperties() const noexcept
 {
-    QJsonDocument ret;
-    QJsonObject object{
+    return JsonBuilder::createOrderedJsonDocument({
         { "Video context", contextPtr->getProperties().object() },
         { "File", filePath },
-    };
-    ret.setObject(object);
-    return ret;
+    });
 }
diff --git a/src/Lib/Document/VivyDocument.cc b/src/Lib/Document/VivyDocument.cc
index 01f15771799f2a80fb5c6e45a705d9688ab92855..6749fcc3cce6e5acb44bf584ccb9c345903835cc 100644
--- a/src/Lib/Document/VivyDocument.cc
+++ b/src/Lib/Document/VivyDocument.cc
@@ -1,5 +1,6 @@
 #include "VivyDocument.hh"
 #include "../Utils.hh"
+#include "../JsonBuilder.hh"
 
 using namespace Vivy;
 
@@ -400,21 +401,13 @@ VivyDocument::getElementName() const noexcept
 QJsonDocument
 VivyDocument::getProperties() const noexcept
 {
-    QJsonDocument ret;
-    QJsonObject object;
-    QJsonObject subDocObject;
-
-    subDocObject.insert("Audio sub-document",
-                        audioDocument ? audioDocument->getProperties().object() : QJsonValue());
-    subDocObject.insert("Video sub-document",
-                        videoDocument ? videoDocument->getProperties().object() : QJsonValue());
-    subDocObject.insert("ASS sub-document",
-                        assDocument ? assDocument->getProperties().object() : QJsonValue());
-
-    object.insert("Uuid", getUuid().toString());
-    object.insert("Name", getName());
-    object.insert("Sub documents", subDocObject);
-
-    ret.setObject(object);
-    return ret;
+    return JsonBuilder::createOrderedJsonDocument(
+        { { QStringLiteral("Uuid"), getUuid().toString() },
+          { QStringLiteral("Name"), getName() },
+          { QStringLiteral("Sub documents"),
+            JsonBuilder::createOrderedJsonObject({
+                JsonBuilder::getSubDocumentJson("Audio sub document", audioDocument),
+                JsonBuilder::getSubDocumentJson("Video sub document", videoDocument),
+                JsonBuilder::getSubDocumentJson("ASS sub document", assDocument),
+            }) } });
 }