1.改用
读取json的配置文件能否想java和c#直接完成json字符串到对象的赋值呢,答案是不能?
能否用宏实现呢
比如:#define funMacro(json的键(变量名)) 变量名= jsonObject[#键].toInt();
这个看上去是个理想的选择,如果成功了,就能完成值和建的自动匹配了
但实际上失败了,因为宏的特点是变量可以变成字符串,而字符串的值却无法变成变量。
QString key = keys.at(i);
funMacro(a);
期待这个宏的结果是,如果变量和key的名称都是a
那么宏的结果是 key = jsonObject["key "].toInt()
这显然不是我们想要的结果,可以直接用变量a
那么宏的结果是 a = jsonObject["key "].toInt()
这结果对了,可是就无法实现自动的赋值了。
2.代码
2.1 main
#include "testmacro.h"int main(int argc, char *argv[])
{TestMacro tm;qDebug() << "Hello, World!";return 0;
}
2.2 testmacro.h
#ifndef TESTMACRO_H
#define TESTMACRO_Hclass TestMacro
{
public:TestMacro();
};#endif // TESTMACRO_H
2.3 testmacromod.h
#ifndef TESTMACROMOD_H
#define TESTMACROMOD_H#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>class TestMacroMod
{
public:TestMacroMod();int a;void setJson(QJsonObject jsonObject);
};#endif // TESTMACROMOD_H
2.4 testmacro.cpp
#include "testmacro.h"
#include "testmacromod.h"TestMacro::TestMacro() {TestMacroMod tm;QJsonObject obj;obj.insert("a",7);tm.setJson(obj);
}
2.5 testmacromod.cpp
#include "testmacromod.h"
#include <QDebug>
#define funMacro(ms) ms = jsonObject[#ms].toInt();TestMacroMod::TestMacroMod() {}void TestMacroMod::setJson(QJsonObject jsonObject){a = jsonObject["a"].toInt();QStringList keys = jsonObject.keys();for(int i=0; i<keys.size(); ++i){QString key = keys.at(i);funMacro(a);}qDebug() <<"a:"<< a;
}
3.运行结果
a: 7
Hello, World!