QJsonArray的问题

时间:2018-01-27 08:38:37

标签: qt qtnetwork

在我的控制台项目中,我有4个功能:ResponseAddDataToListRequestmain

main函数chars中是包含字符a-z的Vector。 managerdocarraylistRequest函数中使用的变量以及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中的Responsejson 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

1 个答案:

答案 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()并在当前实现中输入主事件循环。