/** * Json <-> DDS conversion routines * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-11-30 */ {% autoescape off %} // filename: {{ namespace_abbr }}_json.cpp #include "{{ namespace_abbr }}_json.h" #include #include #include #include #include namespace {{ namespace }} { template<> int fromJson(const QJsonValue &val, type) { return val.toInt(); } template<> double fromJson(const QJsonValue &val, type) { return val.toDouble(); } template<> qint64 fromJson(const QJsonValue &val, type) { return val.toString().toLongLong(); } QJsonValue toJson(int vec) { return QJsonValue(vec); } QJsonValue toJson(double vec) { return QJsonValue(vec); } QJsonValue toJson(qint64 vec) { return QJsonValue(QString::number(vec)); } // std::string QJsonValue toJson(const std::string &element) { return QJsonValue(QString::fromStdString(element)); } template<> std::string fromJson(const QJsonValue &val, type) { return val.toString().toStdString(); } // std::vector template QJsonArray toJson(const std::vector &vec) { QJsonArray arr; for (const auto &element : vec) arr.push_back(toJson(element)); return arr; } template std::vector fromJson(const QJsonValue &val, type>) { std::vector ret; if (!val.isArray()) return ret; const QJsonArray array(val.toArray()); ret.reserve(array.size()); for(int i = 0; i < array.size(); ++i) ret.push_back(fromJson(array.at(i), type{})); return ret; } // dds::core:vector (bytestream) inline QJsonValue toJson(const std::vector &element) { return QJsonValue(QString::fromLatin1(QByteArray::fromRawData(reinterpret_cast(&element.at(0)), static_cast(element.size())).toBase64())); } template<> std::vector fromJson(const QJsonValue &val, type>) { const QByteArray ba(QByteArray::fromBase64(val.toString().toLatin1())); return LtsUtils::convert>(ba); } {% for dt in jsonTopics %} // {{ dt.name }} QJsonObject toJson(const {{ dt.name }} &element) { QJsonObject obj; {% for row in dt.cppMember %} {{ row.ddsToJsonElement }}; {% endfor %} return obj; } template<> {{ dt.name }} fromJson(const QJsonValue &value, type<{{ dt.name }}>) { const QJsonObject objElement(value.toObject()); {{ dt.name }} element; {% for row in dt.cppMember %} { {{ row.jsonElementToDds }}; } {% endfor %} return element; } // // extensions to support sequence of seqence of Non-POD : // QJsonValue toJson(const std::vector <{{ dt.name }} > &element) { if (element.size() == 0) return QJsonValue(); QJsonArray array; for(size_t i = 0; i < element.size(); ++i) array.push_back(toJson(element.at(i))); return array; } template<> std::vector<{{ dt.name }}> fromJson(const QJsonValue &value, type< std::vector <{{ dt.name }} > >) { std::vector < {{ dt.name }} > ret; if (value.isNull()) return ret; if (!value.isArray()) return ret; const QJsonArray array = value.toArray(); ret.reserve(array.size()); for(const auto &ele : array) ret.push_back(fromJson(ele, type<{{ dt.name }}>{})); return ret; } {% endfor %} } // namespace {{ namespace }} {% endautoescape %}