QJsonArray 的问题
Trouble with QJsonArray
在我的控制台项目中,我有 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
中,这些字符在传递给 Response
函数的 url
中用作 querystring
,以获取 json array
和 [ 的每个元素=21=] 然后添加到 AddDataToList
函数中名为 list
的 Vector。
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());
}
main
的最后一行写了 list
中元素的数量,我希望每次运行时得到相同的数字,但数字是:
19793、19703、19791 等
reply->error()
总是给出 NoError
。
问题出在哪里?
编辑:
我也在 C# 中编写了等效代码,其中我必须在 try-catch
中使用 Newtonsoft.Json
的 DeserializeObject
方法才能完成循环。连续 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())
。在某些情况下,它会在 doc
中分配 <html>
。
为什么发送 <html>
而不是 json
?
我对您的问题感到好奇,并将您的代码添加到我的测试应用程序中。
我需要进行一项更改才能让您使用 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);
我还向请求添加了日志记录
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 Class 的更多详细信息。
注意:在您当前的实现中没有必要调用 QCoreApplication::exec() 并进入主事件循环。
在我的控制台项目中,我有 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
中,这些字符在传递给 Response
函数的 url
中用作 querystring
,以获取 json array
和 [ 的每个元素=21=] 然后添加到 AddDataToList
函数中名为 list
的 Vector。
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());
}
main
的最后一行写了 list
中元素的数量,我希望每次运行时得到相同的数字,但数字是:
19793、19703、19791 等
reply->error()
总是给出 NoError
。
问题出在哪里?
编辑:
我也在 C# 中编写了等效代码,其中我必须在 try-catch
中使用 Newtonsoft.Json
的 DeserializeObject
方法才能完成循环。连续 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())
。在某些情况下,它会在 doc
中分配 <html>
。
为什么发送 <html>
而不是 json
?
我对您的问题感到好奇,并将您的代码添加到我的测试应用程序中。
我需要进行一项更改才能让您使用 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);
我还向请求添加了日志记录
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 Class 的更多详细信息。
注意:在您当前的实现中没有必要调用 QCoreApplication::exec() 并进入主事件循环。