jsonmapper.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #ifndef JSONMAPPER_H
  2. #define JSONMAPPER_H
  3. #include <QDebug>
  4. #include <QJsonArray>
  5. #include <QJsonObject>
  6. #include <QJsonValue>
  7. #include <QMetaProperty>
  8. class JsonMapper
  9. {
  10. public:
  11. // 从JSON对象映射到任意结构体/类
  12. template<typename T>
  13. static T fromJson(const QJsonValue &json)
  14. {
  15. T obj;
  16. if (!json.isObject()) {
  17. return obj;
  18. }
  19. QJsonObject jsonObj = json.toObject();
  20. const QMetaObject *metaObj = &T::staticMetaObject;
  21. for (int i = metaObj->propertyOffset(); i < metaObj->propertyCount(); ++i) {
  22. QMetaProperty prop = metaObj->property(i);
  23. QString propName = prop.name();
  24. if (jsonObj.contains(propName)) {
  25. QVariant value = jsonObj[propName].toVariant();
  26. if (value.canConvert(prop.type())) {
  27. prop.writeOnGadget(&obj, value);
  28. }
  29. }
  30. }
  31. return obj;
  32. }
  33. // 从JSON数组映射到列表
  34. template<typename T>
  35. static QList<T> fromJsonArray(const QJsonValue &json)
  36. {
  37. QList<T> list;
  38. if (!json.isArray()) {
  39. return list;
  40. }
  41. QJsonArray array = json.toArray();
  42. for (const QJsonValue &item : array) {
  43. list.append(fromJson<T>(item));
  44. }
  45. return list;
  46. }
  47. };
  48. #endif // JSONMAPPER_H