json字符串之QJsonObject解析
生成Json
QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);
QJsonDocument document;
document.setObject(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
结果:
json_str:{"name": "Qt","version": 5,"windows": true}
解析Json
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("name"))
{
QJsonValue name_value = obj.take("name");
if(name_value.isString())
{
QString name = name_value.toString();
}
}
if(obj.contains("version"))
{
QJsonValue version_value = obj.take("version");
if(version_value.isDouble())
{
int version = version_value.toVariant().toInt();
}
}
if(obj.contains("windows"))
{
QJsonValue version_value = obj.take("windows");
if(version_value.isBool())
{
bool flag = version_value.toBool();
}
}
}
}
结果:
name:Qt
version:5
windows:true
json数组之QJsonArray解析
生成JSON
QJsonArray json;
json.insert(0, QString("Qt"));
json.insert(1, QString("version"));
json.insert(2, true);
QJsonDocument document;
document.setArray(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
结果:
json_str:["Qt","version",true]
解析JSON
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isArray())
{
QJsonArray array = parse_doucment.array();
int size = array.size();
for(int i=0; i
{
QJsonValue value = array.at(i);
if(value.isString())
{
QString name = value.toString();
}
else if(value.isBool())
{
bool flag = value.toBool();
}
}
}
}
结果:
数组不同下标对应的值
0:Qt
1:version
2:true
主要的类与说明
- QJsonObject:代表一个Json对象,包含多个键-值对;
- QJsonArray:代表一个Json数组,可用下标的方法遍历,具体的值可为QJsonValue类型;
- QJsonValue:代表具体的值,值可以是QJsonObject,也可以是QJsonArray(可用isObject()和isArray0方法来判断),或者其他类型;
- QJsonDocument:提供读写一个Json文档的方法,可以返回QJsonObject或QJsonArray,可用isObject(0和isArray()方法来判断;
- QJsonParseError:存储解析Json过程中出现的错误。
总结
1.需要在QByteArray-与QJsonObject或QJsonArray中转换时,用QJsonDocument:
2.解析不成功时,用QJsonParseError分析错误;
3.QJsonObject用value(const QString&key)方法来获取具体的值,类型为QJsonValue;
4.QJsonValue为具体的一个值,可用isXXX0来判断值类型,用toXXX0来转换类型;
5.Json的难点就在于各种类型的嵌套,耐心分析,先判断类型JsonObjeci还是sonArray,然后调用对应方法解析,从而获取到需要的值。