美文网首页
QT获取Json中的部分值

QT获取Json中的部分值

作者: 雯饰太一 | 来源:发表于2023-07-06 12:51 被阅读0次

获取json中的某一个值

template <class T>
bool TryGetJsonVal(const QJsonObject& jObj, const QString& keyName, T& valRef)
{
    if (!jObj.contains(keyName)) return false;
    valRef = jObj.value(keyName).toVariant().value<T>();
    return true;
}

迭代获取某一个键串指定的值

template <class T>
bool TryGetChildJsonVal(const QJsonObject& root, const QStringList& keyList, T& outRef)
{
    //取最后一个值的时候获取的是value
    if (keyList.size() == 0) return false;

    QJsonObject curObj = root;
    int i = 0;
    for (; i < keyList.size() - 1; i++)
    {
        if (!TryGetChildJsonObject(curObj, keyList[i], curObj)) return false;
    }

    return TryGetJsonVal(curObj, keyList[i], outRef);
}

扩展获取

//尝试获取json中的子节点
bool TryGetChildJsonObject(const QJsonObject& jObj, const QString& keyName, QJsonObject& outRef)
{
    if (jObj.contains(keyName) && jObj[keyName].isObject())
    {
        outRef = jObj[keyName].toObject();
        return true;
    }
    return false;
}

//尝试获取json中的子节点
bool TryGetChildJsonArray(const QJsonObject& jObj, const QString& keyName, QJsonArray& outRef)
{
    if (jObj.contains(keyName) && jObj[keyName].isArray())
    {
        outRef = jObj[keyName].toArray();
        return true;
    }
    return false;
}

//尝试获取json中的子节点-迭代
bool TryGetChildJsonObject(const QJsonObject& root, const QStringList& keyList, QJsonObject& outRef)
{
    if (keyList.size() == 0) return false;

    QJsonObject curObj = root;
    for (int i = 0; i < keyList.size(); i++)
    {
        if (!TryGetChildJsonObject(curObj, keyList[i], curObj)) return false;
    }
    outRef = curObj;
    return true;
}

//尝试获取json中的子节点-迭代
bool TryGetChildJsonArray(const QJsonObject& root, const QStringList& keyList, QJsonArray& outRef)
{
    if (keyList.size() == 0) return false;

    QJsonObject curObj = root;
    int i = 0;
    for (; i < keyList.size()-1; i++)
    {
        if (!TryGetChildJsonObject(curObj, keyList[i], curObj)) return false;
    }

    return TryGetChildJsonArray(curObj, keyList[i], outRef);
}

主要是为了在获取值的时候写起来更加方便,直接调用函数就可以了,而且可以在模板函数中直接使用,比直接to指定类型要好用一些,但是这种写法也仅仅是在一个项目中使用了,在其他的项目中使用的是函数特化的特性,实现了相同的效果,且看上去要比这个写法更加的合理,更加的符合序列化的思想。

关于序列化,目前接触到的有两种,二进制序列化,json格式序列化。

QT中对于json处理的相关类,内部使用了智能指针,所以直接赋值的话也没有什么问题,不会耗费什么时间。

相关文章

网友评论

      本文标题:QT获取Json中的部分值

      本文链接:https://www.haomeiwen.com/subject/hzfiydtx.html