xpack库是可以将结构体转为json字符串或者xml的一个库。但是这个库只有头文件,没有其他的cpp或者依赖,这也是我使用的原因。在使用的过程中,发现xpack也是支持Qt的。但是需要修改config.h头文件,将原来注释掉的//#define XPACK_SUPPORT_QT注释,这样就可以在xpack里面使用Qt了。
我们先定义一个结构体:
struct RuleInfoItem
{
QString _name;
QString _icon;
QString _group;
XPACK(AF(F(OE, M), _name, "名称", _icon, "图标", _group, "类别"))
};
在这个结构体中,使用XPACK将变量_name,_icon,_group,分别转为了名称,图标,类别;
接下来定义一个RuleInfoItem变量并初始化,然后使用xpack进行转换;
RuleInfoItem xxx, ttt;
xxx._name = QString::fromLocal8Bit("测试名称");
xxx._icon = QString::fromLocal8Bit("测试图标.bmp");
xxx._group = QString::fromLocal8Bit("测试编组");
QString info = QString::fromLocal8Bit(xpack::json::encode(xxx, 1, 4, ' ').c_str());
转出来发现字符时一个乱码的json字符串:
{
"名称": "娴嬭瘯鍚嶇О",
"图标": "娴嬭瘯鍥炬爣.bmp",
"类别": "娴嬭瘯缂栫粍"
}
顺这个调试发现原来xpack将QString直接转为了C++标准的string类型。
bool encode(const char*key, const QString &val, const Extend *ext) {
std::string str = val.toStdString();
return ((doc_type*)this)->encode(key, str, ext);
}
所以为了所见即所得,我们将std::string str = val.toStdString();修改为std::string str = val.toLocal8Bit().constData();这样我们得到的str就不是乱码,而是我们传进来的中文字符。
最后转出来的json字符串为:
{
"名称": "测试名称",
"图标": "测试图标.bmp",
"类别": "测试编组"
}