Qt解析JSON

发布时间:2023-05-19

一、Qt解析JSON数据

//JSON数据
{
    "name":"Alice",
    "age":18,
    "hobby":["reading","painting"]
}
//Qt代码
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if(jsonDoc.isNull() || !jsonDoc.isObject())
{
    qDebug()<<"JSON数据格式错误";
    return;
}
QJsonObject jsonObj = jsonDoc.object();
QString name = jsonObj.value("name").toString();
int age = jsonObj.value("age").toInt();
QJsonArray hobbyArr = jsonObj.value("hobby").toArray();
foreach(QJsonValue val , hobbyArr)
{
    QString hobby = val.toString();
    qDebug()<<hobby;
}

以上代码通过Qt解析一段JSON数据,并从中获取名字、年龄和爱好信息,并输出到控制台上。

二、Qt解析JSONObject无输出

//JSON数据
{
    "name":"Alice",
    "info":{
        "age":18,
        "hobby":["reading","painting"]
    }
}
//Qt代码
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if(jsonDoc.isNull() || !jsonDoc.isObject())
{
    qDebug()<<"JSON数据格式错误";
    return;
}
QJsonObject jsonObj = jsonDoc.object();
QString name = jsonObj.value("name").toString();
QJsonObject infoObj = jsonObj.value("info").toObject();
int age = infoObj.value("age").toInt();
QJsonArray hobbyArr = infoObj.value("hobby").toArray();
foreach(QJsonValue val , hobbyArr)
{
    QString hobby = val.toString();
    qDebug()<<hobby;
}

以上代码通过Qt解析一个包含JSONObject的JSON数据。如果jsonObj.value("info")没有转成一个对象,则原因是JSON数据格式的问题或者转换过程出现异常导致的。

三、Qt解析JSON文件

//JSON数据,保存在example.json文件中
{
    "name":"Alice",
    "age":18,
    "hobby":["reading","painting"]
}
//Qt代码
QFile file("example.json");
if(!file.open(QIODevice::ReadOnly))
{
    qDebug()<<"打开文件失败";
    return;
}
QByteArray jsonData = file.readAll();
file.close();
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if(jsonDoc.isNull() || !jsonDoc.isObject())
{
    qDebug()<<"JSON数据格式错误";
    return;
}
QJsonObject jsonObj = jsonDoc.object();
QString name = jsonObj.value("name").toString();
int age = jsonObj.value("age").toInt();
QJsonArray hobbyArr = jsonObj.value("hobby").toArray();
foreach(QJsonValue val , hobbyArr)
{
    QString hobby = val.toString();
    qDebug()<<hobby;
}

以上代码通过Qt解析example.json文件中的JSON数据,并从中获取名字、年龄和爱好信息,并输出到控制台上。

四、Qt解析JSONArray

//JSON数据
["reading","painting"]
//Qt代码
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if(jsonDoc.isNull() || !jsonDoc.isArray())
{
    qDebug()<<"JSON数据格式错误";
    return;
}
QJsonArray hobbyArr = jsonDoc.array();
foreach(QJsonValue val , hobbyArr)
{
    QString hobby = val.toString();
    qDebug()<<hobby;
}

以上代码通过Qt解析一个JSONArray,并输出其中的数据到控制台。

五、Qt解析JSON字符串

//JSON字符串
QString strJson = "{\"name\":\"Alice\",\"age\":18,\"hobby\":[\"reading\",\"painting\"]}";
//Qt代码
QJsonDocument jsonDoc = QJsonDocument::fromJson(strJson.toUtf8());
if(jsonDoc.isNull() || !jsonDoc.isObject())
{
    qDebug()<<"JSON数据格式错误";
    return;
}
QJsonObject jsonObj = jsonDoc.object();
QString name = jsonObj.value("name").toString();
int age = jsonObj.value("age").toInt();
QJsonArray hobbyArr = jsonObj.value("hobby").toArray();
foreach(QJsonValue val , hobbyArr)
{
    QString hobby = val.toString();
    qDebug()<<hobby;
}

以上代码通过Qt解析一个JSON字符串,并从中获取名字、年龄和爱好信息,并输出到控制台上。

六、Qt解析JSON没有输出

//JSON数据
{
    "name":"Alice",
    "score": {
        "Math": 90,
        "English": 80
    },
    "hobby":["reading","painting"]
}
//Qt代码
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if(jsonDoc.isNull() || !jsonDoc.isObject())
{
    qDebug()<<"JSON数据格式错误";
    return;
}
QJsonObject jsonObj = jsonDoc.object();
QString name = jsonObj.value("name").toString();
qDebug()<<name;
int mathScore = jsonObj.value("score").toObject().value("Math").toInt();
qDebug()<<"Math Score:"<<mathScore;
int englishScore = jsonObj.value("score").toObject().value("English").toInt();
qDebug()<<"English Score:"<<englishScore;
QJsonArray hobbyArr = jsonObj.value("hobby").toArray();
foreach(QJsonValue val , hobbyArr)
{
    QString hobby = val.toString();
    qDebug()<<hobby;
}

以上代码通过Qt解析一个包含嵌套JSONObject的JSON数据,如果没有值输出,那么原因有二:jsonObj.value("score")没有转成一个对象、JSON数据格式的问题。

七、Qt解析JSONList

在Qt中解析JSONList需要首先引入第三方库QJsonArray,下面是对JSONList的解析示例。

//JSON数据
[
    {
        "name":"Alice",
        "age":18
    },
    {
        "name":"Bob",
        "age":22
    }
]
//Qt代码
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if(jsonDoc.isNull() || !jsonDoc.isArray())
{
    qDebug()<<"JSON数据格式错误";
    return;
}
QJsonArray jsonArray = jsonDoc.array();
foreach(QJsonValue val , jsonArray)
{
    QJsonObject jsonObj = val.toObject();
    QString name = jsonObj.value("name").toString();
    int age = jsonObj.value("age").toInt();
    qDebug()<<name<<age;
}

八、Qt解析JSONArray需要三方库吗

Qt自带的QJsonDocument、QJsonObject、QJsonArray类可以解析任何合法的JSON数据,不需要引入其他第三方库。

九、Qt解析JSONObject输出为空

//JSON数据
{
    "name":"Alice",
    "score": {
        "Math": 90,
        "English": 80
    },
    "hobby":["reading","painting"]
}
//Qt代码
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if(jsonDoc.isNull() || !jsonDoc.isObject())
{
    qDebug()<<"JSON数据格式错误";
    return;
}
QJsonObject jsonObj = jsonDoc.object();
QString name = jsonObj.value("name").toString();
qDebug()<<name;
QJsonValue scoreVal = jsonObj.value("score");
if(scoreVal.isNull() || !scoreVal.isObject())
{
    qDebug()<<"score数据格式错误";
    return;
}
QJsonObject scoreObj = scoreVal.toObject();
int mathScore = scoreObj.value("Math").toInt();
qDebug()<<"Math Score:"<<mathScore;
int englishScore = scoreObj.value("English").toInt();
qDebug()<<"English Score:"<<englishScore;
QJsonArray hobbyArr = jsonObj.value("hobby").toArray();
foreach(QJsonValue val , hobbyArr)
{
    QString hobby = val.toString();
    qDebug()<<hobby;
}

如果JSON对象中某一个值为null或者值类型不匹配,则原因可能是JSON数据格式的问题或者转换过程中出现异常导致的。