jsonmapper.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #ifndef JSONMAPPER_H
  2. #define JSONMAPPER_H
  3. #include <QJsonArray>
  4. #include <QJsonObject>
  5. #include <QJsonValue>
  6. #include <QMap>
  7. #include <QMetaProperty>
  8. #include <QVariant>
  9. #include "QtJsonSerializer"
  10. #include "qjsonobject.h"
  11. class JsonMapper
  12. {
  13. public:
  14. // 从JSON对象映射到任意Q_GADGET结构体/类
  15. template<typename T>
  16. static T fromJson(const QJsonValue &json)
  17. {
  18. T obj;
  19. if (!json.isObject()) {
  20. return obj;
  21. }
  22. QJsonObject jsonObj = json.toObject();
  23. const QMetaObject *metaObj = &T::staticMetaObject;
  24. for (int i = metaObj->propertyOffset(); i < metaObj->propertyCount(); ++i) {
  25. QMetaProperty prop = metaObj->property(i);
  26. QString propName = prop.name();
  27. if (jsonObj.contains(propName)) {
  28. QVariant value = jsonObj[propName].toVariant();
  29. if (value.canConvert(prop.type())) {
  30. prop.writeOnGadget(&obj, value);
  31. }
  32. }
  33. }
  34. return obj;
  35. }
  36. // 从JSON数组映射到QList<T>
  37. template<typename T>
  38. static QList<T> fromJsonArray(const QJsonValue &json)
  39. {
  40. QList<T> list;
  41. if (!json.isArray()) {
  42. return list;
  43. }
  44. QJsonArray array = json.toArray();
  45. for (const QJsonValue &item : array) {
  46. list.append(fromJson<T>(item));
  47. }
  48. return list;
  49. }
  50. template<typename T>
  51. static QJsonValue toJson(const T &obj)
  52. {
  53. try {
  54. QtJsonSerializer::JsonSerializer serializer;
  55. return serializer.serialize(obj);
  56. } catch (QtJsonSerializer::Exception &e) {
  57. qDebug() << e.what();
  58. }
  59. return QJsonValue();
  60. }
  61. template<typename T>
  62. static T formJsonEx(const QJsonObject &obj)
  63. {
  64. try {
  65. QtJsonSerializer::JsonSerializer serializer;
  66. return serializer.deserialize<T>(obj);
  67. } catch (QtJsonSerializer::Exception &e) {
  68. qDebug() << e.what();
  69. }
  70. return T();
  71. }
  72. private:
  73. };
  74. #endif // JSONMAPPER_H