源码
改写自QT自带example里的googlesuggest(文件名都没改),因为众所周知的原因,我运行该示例没有反应……所以想着能不能将google的接口改成bing的接口。
示例里,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怎么对应和转换。
还有最重要的一点:一定要细心!!!