Проблема с 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
====================================================

Могу ли я получить аналогичную ошибку в моем QtResponse функция, когда я звоню: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() и вводить основной цикл обработки событий в вашей текущей реализации.

Другие вопросы по тегам