将 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是空的。

  1. 有没有一种方法可以将 QMap<String, QString> 转换为 QMap<String, QVariant>,所以上面的 v 可能有效?
  2. 为什么上面v是空的?我读到有人在说 QVariantqMetaData,鉴于以下有效,我不明白为什么 QStringqMetaData 问题:
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();
}

这似乎是一种风格选择,我不确定哪个会更快。两者产生相同的输出。

需要注意的一点:从QStringQVariant的转换是在Qt中预定义的,所以第一种方法可以正常工作。对于您自己的 类 对象,您必须注册该类型并提供合适的转换,这可能有点难以正确完成。在第二种方法中,您可以在循环中内联执行此转换。