QJsonArray 的问题

Trouble with QJsonArray

在我的控制台项目中,我有 4 个函数:ResponseAddDataToListRequestmain

main函数中chars是一个包含字符a-z的Vector。 managerdocarraylist 是要在 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.JsonDeserializeObject 方法才能完成循环。连续 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 函数中添加 constQString &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() 并进入主事件循环。