在我的控制台项目中,我有4个功能:Response
,AddDataToList
,Request
和main
。
在main
函数chars
中是包含字符a-z的Vector。 manager
,doc
,array
和list
是Request
函数中使用的变量以及chars
的元素。在第一个for
循环中,chars
中的单个字符(例如a,b,c,...,z)将传递给Request
,并在以下嵌套for
循环中传递两个字符(例如aa,ab,ac,...,zz)将传递给Request
。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVector<char> chars;
for (int i = 97; i < 123; i++) chars.push_back((char)i);
QNetworkAccessManager manager;
QJsonDocument doc;
QJsonArray array;
QVector<QString> list;
int count = chars.count();
for (int i = 0; i < count; i++) {
Request(manager, QString(chars[i]), doc, array, list);
for (int j = 0; j < count; j++)
Request(manager, QString("%1%2").arg(chars[i]).arg(chars[j]), doc, array, list);
}
qDebug() << "Total: " + QString::number(list.count());
return a.exec();
}
在Request
querystring
中,这些字符用作url
中的Response
,json array
传递给array
函数以获取list
以及{{1}的每个元素然后将{}添加到AddDataToList
函数中名为void Request(QNetworkAccessManager &manager, QString &queryString,
QJsonDocument &doc, QJsonArray &array, QVector<QString> &list)
{
QUrl url =QString("http://www.icab.org.bd/icabweb/firmCompanyAudited/geJsonAuditedFirm?term=%1").arg(queryString);
Response(manager.get(QNetworkRequest(url)), doc, array);
AddDataToList(list, array);
}
void Response(QNetworkReply *reply, QJsonDocument &doc, QJsonArray& array)
{
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
doc = QJsonDocument::fromJson(reply->readAll());
delete reply;
array = doc.array();
}
void AddDataToList(QVector<QString> &list, QJsonArray &array)
{
int count = array.count();
for (int n = 0; n < count; n++) list.append(array[n].toString());
}
的Vector中。
main
list
的最后一行写了reply->error()
中的元素数量,我希望每次运行时都会得到相同的数字,但数字是:
19793,19703,19791等
NoError
始终提供Newtonsoft.Json
。
问题在哪里?
修改
我还在C#中编写了等效代码,我必须在DeserializeObject
中使用try-catch
的{{1}}方法才能完成循环。连续5次测试的结果是:
Test Session: 0
19793 item found
0 item in error List
====================================================
Test Session: 1
ev : Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
yy : Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
19743 item found
2 item in error List
====================================================
Test Session: 2
cm : Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
jv : Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
nl : Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
19737 item found
3 item in error List
====================================================
Test Session: 3
uk : Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
19743 item found
1 item in error List
====================================================
Test Session: 4
lk : Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
19768 item found
1 item in error List
====================================================
当我致电时,我的Qt
Response
函数可能会出现类似的错误:
QJsonDocument::fromJson(reply->readAll())
或doc.array()
?
我想问题出在doc = QJsonDocument::fromJson(reply->readAll())
。在某些情况下,它会在<html>
中分配doc
。
为什么发送<html>
而不是json
?
答案 0 :(得分:1)
我对您的问题感到好奇,并将您的代码添加到我的测试应用程序中。
我需要做一个更改才能让您使用gcc编译代码。您将临时对象作为查询字符串传递。在Request函数中将 const 添加到QString &queryString
。我猜你使用的MS编译器并不严格......
error: invalid initialization of non-const reference of
type ‘QString&’ from an rvalue of type ‘QString’
Request(manager, QString(chars[i]), doc, array, list);
我还添加了日志记录到Request
qDebug() << "queryString:" << queryString;
以及AddDataToList
void AddDataToList(QVector<QString> &list, QJsonArray &array)
{
int count = array.count();
qDebug() << "count:" << count;
for (int n = 0; n < count; n++)
{
QString appendString = array[n].toString();
qDebug() << "index:" << n << "appendString:" << appendString;
list.append(appendString);
}
}
然后我开始测试。我通过将整数改为110来使用较短的字符数组 - > 119导致查询字符串n,nn, -> vu,vv
。我在每轮测试中将输出定向到一个文件,以便我可以在之后分析结果。
我的结果2984超过10次。在大约半小时的测试期间,我得到了两个不同的结果。我比较了日志文件,发现有时服务器在不同的结果中返回了一些查询字符串的空响应。括号中的结果计数2984。
我得到了结果2816一次:
queryString: "nr"
count: 0 (18)
queryString: "ns"
count: 0 (50)
queryString: "nt"
count: 0 (50)
queryString: "nu"
count: 0 (50)
我得到了结果2934一次:
queryString: "or"
count: 0 (50)
我会说这是服务器问题。
除了EDIT部分问题:
你没有得到详细的错误输出,但无论如何它都是这样的:
QJsonParseError e;
doc = QJsonDocument::fromJson(reply->readAll(), &e);
if ( e.error != QJsonParseError::NoError )
{
qWarning() << "Json parse error:" << e.errorString().toLatin1().data();
}
以下是解析后的内容:
queryString: "uy"
Json parse error: illegal value
count: 0
从here查看有关QJsonParseError类的更多详细信息。
注意:没有必要调用QCoreApplication :: exec()并在当前实现中输入主事件循环。