C++没有元对象,无法实现json和对象的映射(比如GSon),或者数据库的对象关系映射(比如GreenDao)。C++可以获取变量的字符串(#define name2str(name) (#name))和变量的类型(#define getType(value) typeid(value).name()),但是并没有办法遍历类的成员属性。解决办法是给类添加一个map,在构造函数中实现成员变量名称和成员变量类型的map,但这比较复杂。QT有QVariant,可以很好的实现映射。
QVariant与对象
class User {
Qstring name;
int age;
}
User user;
user.name = "zhang";
user.age = 100;
QVariantMap bob;
bob["name"] = user.name;
bob["age"] = user.age;
QVariant与json
1. 转json字符串
// QVariantMap键值对转json键值对
QVariantMap bob;
bob.insert("name", "Bob");
bob.insert("age", 123);
QVariantMap alice;
alice.insert("Name", "Alice");
alice.insert("Phonenumber", 321);
// QVariantList列表转json数组
QVariantList people;
people << bob << alice;
// 获取 QJsonDocument 对象
QJsonDocument jsonDocument = QJsonDocument::fromVariant(people);
// 生成 JSON 文档
jsonDocument.toJson();
2. 字符串转map
QVariantMap result = jsonDocument.toVariant().toMap();
QMapIterator<QString, int> i(result);
while (i.hasNext()) {
i.next();
cout << i.key() << ": " << i.value() << endl;
}
QVariant与数据表
1. 定义一个类Bean,只有成员属性(成员属性映射数据表中的字段)
2. 把类的成员写入QVariantMap,再把QVariantMap作为参数,传到数据操作层
3. 数据操作层遍历QVariantMap获取查询条件或插入记录
4. 把多个查询结果封装为QList返回