QT:读bing搜索接口返回的json数据

644 阅读1分钟

源码
改写自QT自带example里的googlesuggest(文件名都没改),因为众所周知的原因,我运行该示例没有反应……所以想着能不能将google的接口改成bing的接口。

googlesuggest.gif


示例里,google搜索接口
const QString gsuggestUrl(QStringLiteral("http://google.com/complete/search?output=toolbar&q=%1"));

返回的是xml数据。

而bing搜索接口

const QString gsuggestUrl(QStringLiteral("http://sg1.api.bing.com/qsonhs.aspx?type=cb&cb=callback&q=%1"));

返回的是json数据。

xml和json我都还没学过,临时必应了一下,查了点资料,学习了在QT里是如何解析json数据的,至于前面网络请求等铺垫操作暂时还没学,直接用的示例的源代码(我只改了解析数据的部分代码)

#if 1   // 自制解析json 难点:需要先把.value()取到的值转成object
        // 截取需要的JSON
        QString str_json = response;
        int pos_left = str_json.indexOf("{");   //获取到的bing的json前后都有多余字符串,需要截掉
        str_json = str_json.mid(pos_left);
        int pos_right = str_json.lastIndexOf("}");
        str_json = str_json.left(pos_right + 1);
        // 转成BA后解析截取好的JSON
        QByteArray ba_json = str_json.toUtf8();
        QJsonParseError json_error;
        QJsonDocument jsonDoc = QJsonDocument::fromJson(ba_json,&json_error);
        if(json_error.error == QJsonParseError::NoError)
        {
            QJsonObject rootObj = jsonDoc.object(); //根节点
            if(rootObj.contains("AS"))  // 如果根节点包含AS
            {
                QJsonObject jobj_AS = rootObj.value("AS").toObject();   //把AS对应的value转成对象
                if (jobj_AS.value("Results").isArray()) //  再用这个对象进行.value取值,进而作判断
                {
                    QJsonArray ja_ret = jobj_AS.value("Results").toArray(); //粗心眼花把jobj_AS写错成rootObj调试了好久
                    foreach (auto val_ret, ja_ret)
                    {
                        QJsonObject jobj_retSub = val_ret.toObject();
                        if (jobj_retSub.value("Suggests").isArray())
                        {
                            QJsonArray ja_sug = jobj_retSub.value("Suggests").toArray();
                            foreach (auto val_sug, ja_sug)
                            {
                                QString str = val_sug.toObject().value("Txt").toString();
                                if (editor->text() != str.simplified())
                                {
                                    //qDebug() << str;
                                    choices << str;
                                }
                            }
                        }
                    }
                }
            }
        }
        else
        {
            qDebug() << json_error.errorString() << endl << jsonDoc << endl << ba_json;
        }
#endif

必应搜索接口返回的json数据并不复杂,但就是包含了两个数组分支,把我这个初学者给绕晕了,一直没搞懂QJsonobject的value和QJsonArray怎么对应和转换。
还有最重要的一点:一定要细心!!!