获取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处理的相关类,内部使用了智能指针,所以直接赋值的话也没有什么问题,不会耗费什么时间。
网友评论