将 QMap<QString, QString> 转换为 Json 字符串结果为空
Converting QMap<QString, QString> to Json string results empty
我定义并使用了一个函数:
// usage:
QMap<QString, QString> map = ...;
foo(map);
// defination:
QString stringMapToJson(const QMap<QString, QString>& arg) {
QVariant v = QVariant::fromValue(arg);
JsonDocument doc = QJsonDocument::fromVariant(v);
...
}
然后我意识到v
是空的。
- 有没有一种方法可以将
QMap<String, QString>
转换为 QMap<String, QVariant>
,所以上面的 v
可能有效?
- 为什么上面
v
是空的?我读到有人在说 QVariant
和 qMetaData
,鉴于以下有效,我不明白为什么 QString
有 qMetaData
问题:
QString s = "";
QVariant v = s;
(一位Java程序员开始了愉快的C++之旅。)
谢谢。
有两种方法可以做到这一点。首先是将您的地图转换为您提到的 QMap<QString, QVariant>
:
QByteArray stringMapToJson1(const QMap<QString, QString>& arg)
{
QVariantMap vmap;
for(auto it = arg.cbegin(); it != arg.cend(); ++it)
{
vmap.insert(it.key(), it.value());
}
const QVariant v = QVariant::fromValue(vmap);
const QJsonDocument doc = QJsonDocument::fromVariant(v);
return doc.toJson();
}
或者,您可以直接从地图构建 json 对象。在这种情况下,代码量相同:
QByteArray stringMapToJson2(const QMap<QString, QString>& arg)
{
QJsonObject jObj;
for(auto it = arg.cbegin(); it != arg.cend(); ++it)
{
jObj.insert(it.key(), it.value());
}
QJsonDocument doc;
doc.setObject(jObj);
return doc.toJson();
}
这似乎是一种风格选择,我不确定哪个会更快。两者产生相同的输出。
需要注意的一点:从QString
到QVariant
的转换是在Qt中预定义的,所以第一种方法可以正常工作。对于您自己的 类 对象,您必须注册该类型并提供合适的转换,这可能有点难以正确完成。在第二种方法中,您可以在循环中内联执行此转换。
我定义并使用了一个函数:
// usage:
QMap<QString, QString> map = ...;
foo(map);
// defination:
QString stringMapToJson(const QMap<QString, QString>& arg) {
QVariant v = QVariant::fromValue(arg);
JsonDocument doc = QJsonDocument::fromVariant(v);
...
}
然后我意识到v
是空的。
- 有没有一种方法可以将
QMap<String, QString>
转换为QMap<String, QVariant>
,所以上面的v
可能有效? - 为什么上面
v
是空的?我读到有人在说QVariant
和qMetaData
,鉴于以下有效,我不明白为什么QString
有qMetaData
问题:
QString s = "";
QVariant v = s;
(一位Java程序员开始了愉快的C++之旅。)
谢谢。
有两种方法可以做到这一点。首先是将您的地图转换为您提到的 QMap<QString, QVariant>
:
QByteArray stringMapToJson1(const QMap<QString, QString>& arg)
{
QVariantMap vmap;
for(auto it = arg.cbegin(); it != arg.cend(); ++it)
{
vmap.insert(it.key(), it.value());
}
const QVariant v = QVariant::fromValue(vmap);
const QJsonDocument doc = QJsonDocument::fromVariant(v);
return doc.toJson();
}
或者,您可以直接从地图构建 json 对象。在这种情况下,代码量相同:
QByteArray stringMapToJson2(const QMap<QString, QString>& arg)
{
QJsonObject jObj;
for(auto it = arg.cbegin(); it != arg.cend(); ++it)
{
jObj.insert(it.key(), it.value());
}
QJsonDocument doc;
doc.setObject(jObj);
return doc.toJson();
}
这似乎是一种风格选择,我不确定哪个会更快。两者产生相同的输出。
需要注意的一点:从QString
到QVariant
的转换是在Qt中预定义的,所以第一种方法可以正常工作。对于您自己的 类 对象,您必须注册该类型并提供合适的转换,这可能有点难以正确完成。在第二种方法中,您可以在循环中内联执行此转换。