QT获取Json中的部分值

json中获取出来的值是需要判空的

Posted by 雯饰太一 on June 25, 2023

QT获取Json中的部分值

获取json中的某一个值

1
2
3
4
5
6
7
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;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
}

扩展获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//尝试获取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处理的相关类,内部使用了智能指针,所以直接赋值的话也没有什么问题,不会耗费什么时间。