From 12614a174add6e2e4e9f10aadefdcd34e1c92c91 Mon Sep 17 00:00:00 2001 From: garakmon Date: Thu, 5 Mar 2020 16:38:45 -0500 Subject: [PATCH] modify Json::dump to preserve our format --- include/core/orderedjson.h | 35 +++++++++++++++++++++--- src/core/orderedjson.cpp | 54 +++++++++++++++++++++++--------------- 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/include/core/orderedjson.h b/include/core/orderedjson.h index dd74f5f4..b035b1d7 100644 --- a/include/core/orderedjson.h +++ b/include/core/orderedjson.h @@ -56,11 +56,16 @@ #include #include +#include +#include #include #include #include +// temp +#include + #ifdef _MSC_VER #if _MSC_VER <= 1800 // VS 2013 #ifndef noexcept @@ -158,10 +163,14 @@ public: const Json & operator[](const QString &key) const; // Serialize. - void dump(QString &out) const; - QString dump() const { + void dump(QString &out, int *) const; + QString dump(int *indent = nullptr) const { QString out; - dump(out); + if (!indent) { + int temp = 0; + indent = &temp; + } + dump(out, indent); return out; } @@ -199,6 +208,24 @@ private: std::shared_ptr m_ptr; }; +class JsonDoc { +public: + JsonDoc(Json *object) { + this->m_obj = object; + this->m_indent = 0; + }; + + void dump(QFile *file) { + QTextStream fileStream(file); + fileStream << m_obj->dump(&m_indent); + fileStream << "\n"; // pad file with newline + } + +private: + Json *m_obj; + int m_indent; +}; + // Internal class hierarchy - JsonValue objects are not exposed to users of this API. class JsonValue { protected: @@ -208,7 +235,7 @@ protected: virtual Json::Type type() const = 0; virtual bool equals(const JsonValue * other) const = 0; virtual bool less(const JsonValue * other) const = 0; - virtual void dump(QString &out) const = 0; + virtual void dump(QString &out, int *indent) const = 0; virtual double number_value() const; virtual int int_value() const; virtual bool bool_value() const; diff --git a/src/core/orderedjson.cpp b/src/core/orderedjson.cpp index ba9ebab6..73e85121 100644 --- a/src/core/orderedjson.cpp +++ b/src/core/orderedjson.cpp @@ -26,6 +26,8 @@ #include #include +#include + namespace poryjson { static const int max_depth = 200; @@ -48,11 +50,11 @@ struct NullStruct { * Serialization */ -static void dump(NullStruct, QString &out) { +static void dump(NullStruct, QString &out, int *) { out += "null"; } -static void dump(double value, QString &out) { +static void dump(double value, QString &out, int *) { if (std::isfinite(value)) { char buf[32]; snprintf(buf, sizeof buf, "%.17g", value); @@ -62,17 +64,17 @@ static void dump(double value, QString &out) { } } -static void dump(int value, QString &out) { +static void dump(int value, QString &out, int *) { char buf[32]; snprintf(buf, sizeof buf, "%d", value); out += buf; } -static void dump(bool value, QString &out) { +static void dump(bool value, QString &out, int *) { out += value ? "true" : "false"; } -static void dump(const QString &value, QString &out) { +static void dump(const QString &value, QString &out, int *) { out += '"'; for (int i = 0; i < value.length(); i++) { const char ch = value[i].unicode(); @@ -109,34 +111,44 @@ static void dump(const QString &value, QString &out) { out += '"'; } -static void dump(const Json::array &values, QString &out) { +static void dump(const Json::array &values, QString &out, int *indent) { bool first = true; - out += "["; + if (!out.endsWith(": ")) out += QString(*indent * 2, ' '); + out += "[\n"; + *indent += 1; for (const auto &value : values) { - if (!first) - out += ", "; - value.dump(out); + if (!first) { + out += ",\n"; + } + value.dump(out, indent); first = false; } - out += "]"; + *indent -= 1; + out += "\n" + QString(*indent * 2, ' ') + "]"; } -static void dump(const Json::object &values, QString &out) { +static void dump(const Json::object &values, QString &out, int *indent) { bool first = true; - out += "{"; + if (!out.endsWith(": ")) out += QString(*indent * 2, ' '); + out += "{\n"; + *indent += 1; for (const auto &kv : values) { - if (!first) - out += ", "; - dump(kv.first, out); + if (!first) { + out += ",\n"; + } + out += QString(*indent * 2, ' '); + dump(kv.first, out, indent); out += ": "; - kv.second.dump(out); + kv.second.dump(out, indent); first = false; } - out += "}"; + *indent -= 1; + out += "\n" + QString(*indent * 2, ' ') + "}"; } -void Json::dump(QString &out) const { - m_ptr->dump(out); + +void Json::dump(QString &out, int *indent) const { + m_ptr->dump(out, indent); } /* * * * * * * * * * * * * * * * * * * * @@ -165,7 +177,7 @@ protected: } const T m_value; - void dump(QString &out) const override { poryjson::dump(m_value, out); } + void dump(QString &out, int *indent) const override { poryjson::dump(m_value, out, indent); } }; class JsonDouble final : public Value {