diff --git a/src/Lib/JsonBuilder.cc b/src/Lib/JsonBuilder.cc
new file mode 100644
index 0000000000000000000000000000000000000000..105445ea825b94a0a6abac131139ea2621f38ffa
--- /dev/null
+++ b/src/Lib/JsonBuilder.cc
@@ -0,0 +1,25 @@
+#include "JsonBuilder.hh"
+
+using namespace Vivy;
+
+QJsonArray
+JsonBuilder::createOrderedJsonObject(
+    std::initializer_list<QPair<QString, QJsonValue>> elements) noexcept
+{
+    QJsonArray ret;
+    int index = 0;
+
+    for (const QPair<QString, QJsonValue> &elem : elements) {
+        ret.insert(index, QJsonObject({ elem }));
+        ++index;
+    }
+
+    return ret;
+}
+
+QJsonDocument
+JsonBuilder::createOrderedJsonDocument(
+    std::initializer_list<QPair<QString, QJsonValue>> elements) noexcept
+{
+    return QJsonDocument(createOrderedJsonObject(elements));
+}
diff --git a/src/Lib/JsonBuilder.hh b/src/Lib/JsonBuilder.hh
new file mode 100644
index 0000000000000000000000000000000000000000..4534b46381f19e29a24b084c3771c32b46f13adf
--- /dev/null
+++ b/src/Lib/JsonBuilder.hh
@@ -0,0 +1,31 @@
+#pragma once
+
+#include "Utils.hh"
+
+namespace Vivy
+{
+// Struct used to englobe all json build facilities. This is a class used as a
+// private-able namespace that can't be 'using' and thus create unreadable
+// code. You can't build this thing, everything is static inside.
+struct JsonBuilder final {
+    VIVY_UNMOVABLE_OBJECT(JsonBuilder)
+
+    static QJsonArray
+    createOrderedJsonObject(std::initializer_list<QPair<QString, QJsonValue>> elements) noexcept;
+
+    static QJsonDocument
+    createOrderedJsonDocument(std::initializer_list<QPair<QString, QJsonValue>> elements) noexcept;
+
+    template <PropertyConstViewable T> static QPair<QString, QJsonValue>
+    getSubDocumentJson(const QString &name, std::shared_ptr<T> subDocPtr) noexcept
+    {
+        if (subDocPtr == nullptr)
+            return QPair{ name, QJsonValue() };
+        else
+            return QPair{ name, subDocPtr->getProperties().object() };
+    }
+
+private:
+    JsonBuilder() noexcept {}
+};
+}