| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #ifndef JSONMAPPER_H
- #define JSONMAPPER_H
- #include <QDebug>
- #include <QJsonArray>
- #include <QJsonObject>
- #include <QJsonValue>
- #include <QMetaProperty>
- class JsonMapper
- {
- public:
- // 从JSON对象映射到任意结构体/类
- template<typename T>
- static T fromJson(const QJsonValue &json)
- {
- T obj;
- if (!json.isObject()) {
- return obj;
- }
- QJsonObject jsonObj = json.toObject();
- const QMetaObject *metaObj = &T::staticMetaObject;
- for (int i = metaObj->propertyOffset(); i < metaObj->propertyCount(); ++i) {
- QMetaProperty prop = metaObj->property(i);
- QString propName = prop.name();
- if (jsonObj.contains(propName)) {
- QVariant value = jsonObj[propName].toVariant();
- if (value.canConvert(prop.type())) {
- prop.writeOnGadget(&obj, value);
- }
- }
- }
- return obj;
- }
- // 从JSON数组映射到列表
- template<typename T>
- static QList<T> fromJsonArray(const QJsonValue &json)
- {
- QList<T> list;
- if (!json.isArray()) {
- return list;
- }
- QJsonArray array = json.toArray();
- for (const QJsonValue &item : array) {
- list.append(fromJson<T>(item));
- }
- return list;
- }
- };
- #endif // JSONMAPPER_H
|