Проблема с QJsonArray
В моем консольном проекте у меня есть 4 функции: Response
, AddDataToList
, Request
а также main
,
В main
функция chars
Вектор, содержащий символы az. manager
, doc
, array
а также list
переменные, которые будут использоваться в Request
функционировать вместе с элементами chars
, Во-первых for
зацикливание одного символа (например, a,b,c,…,z) из chars
передается 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
в 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());
}
Последняя строка main
записывает количество элементов в list
и я ожидал получить один и тот же номер каждый раз, когда он работает, но номер был:
19793, 19703, 19791 и др.
reply->error()
всегда дает NoError
, В чем проблема?
РЕДАКТИРОВАТЬ:
Я также написал эквивалентный код на C#, где мне пришлось использовать Newtonsoft.Json
"s DeserializeObject
метод в try-catch
для того, чтобы завершить цикл. Результат 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
?
1 ответ
Мне стало любопытно узнать о вашей проблеме и добавить ваш код в мое тестовое приложение.
Мне нужно было сделать одно изменение, чтобы получить код, скомпилированный с помощью gcc. Вы передавали временный объект в виде строки запроса. Добавить 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)
Я бы сказал, что это проблема с сервером.
Дополнение к РЕДАКТИРОВАТЬ часть вопроса:
Вы не получите такой подробный вывод об ошибке, но в любом случае это происходит так:
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
Смотрите более подробную информацию о QJsonParseError Class здесь.
Примечание. Нет смысла вызывать QCoreApplication::exec() и вводить основной цикл обработки событий в вашей текущей реализации.