1

我试图在 qt 5.1 中启动 json 的包装类,我正在开发一个函数,该函数将检查输入的 var 是 QVariantMap 还是只是 QVariant,并且一切正常,直到我进入第二级木里地门阵。这是我的数组结构和类代码。

JsonHelper jh;
QVariantMap obj = jh.getJsonObjectVarientMap(data);

这给我带来了问题,当我只使用“obj”或“obj[“1”]”时没有问题,只有当我

 // obj["4"]["3"] this causes the problems
qDebug() <<  "Your returned val is : " << jh.keySearchVal(obj["4"]["3"],arr_index_txt);
QMap<QString,QVariant> mp = obj["4"].toMap();
foreach(QString key,mp.keys())
{
    // this works ok
    qDebug() << "key : " << key << " : val : " << mp[key];
}

QVariantMap JsonHelper::getJsonObjectVarientMap(QString in)
{
    QJsonDocument d = QJsonDocument::fromJson(in.toUtf8());
    return d.object().toVariantMap();
}

QVariant JsonHelper::keySearchVal(QVariant source, QString key)
{
    QString type(source.typeName());
    if(type=="QVariantMap")
    {
        QMap<QString, QVariant> map = source.toMap();
        foreach(QString key_inner,map.keys())
        {
            QVariant in = map[key_inner];
            if(key_inner==key)
            {
                return getVariantVal(in);
            }
        }
    }
    return "";
}

QVariant JsonHelper::keySearchVal(QVariantMap source, QString key)
{
    foreach(QString key_inner,source.keys())
    {
        if(key_inner==key)
        {
            return source[key_inner];
        }
    }
    return "";
}

     QVariant JsonHelper::getVariantVal(QVariant in)
     {
    qDebug() << "from variant";
    QString type(in.typeName());
    if(type=="QVariantMap")
    {
        return in.toMap();
    }
    return in;
}
4

1 回答 1

1

// obj["4"]["3"] 这会导致问题

这是无效QVariant的,因为没有 operator[] 重载。这也是编译器试图告诉你的:

'operator[]' 不匹配(操作数类型是 'QVariant' 和 'const char [2]')QVariant/QVariantMap

如果这是底层数据类型,您将需要将任何嵌套的 QVariant 显式转换为 QVariantMap。详情见以下方法

QMap QVariant::toMap() 常量

如果变体具有 type() QMetaType::QVariantMap,则将变体作为 QMap 返回;否则返回一个空地图。

这不是重点,但您还有两个问题:

  • 您似乎使用了 Varient 这个词而不是 Variant。

  • 您的代码缺少错误检查和转换报告等。

于 2014-01-06T04:28:24.917 回答