QIODevice :: read:设备未打开远程JSON文件QT

时间:2017-11-18 02:03:01

标签: c++ json qt qt5

这让我疯了。一直在寻找解决方案,但令人惊讶的是,将远程JSON文件加载到QT中几乎没有。

当我尝试加载本地文件时,我的代码工作正常。

QFile jsonFile("/Users/blah/blah/myfile.json");


if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
    qDebug() << "Unable to open file, exiting...";
    return;
}

QByteArray jsonData = jsonFile.readAll();
QJsonDocument doc = QJsonDocument::fromJson(jsonData);
QJsonObject jObject = doc.object();
QVariantMap json_map = jObject.toVariantMap();

QString getNow = json_map["now"].toString();
QString getImage = json_map["image"].toString();
QString getNext = json_map["next"].toString();

ui->live1->setText(getNow);
ui->live2->setText(getImage);
ui->live3->setText(getNext);

但是我在过去5个小时内没有尝试过任何东西会让它加载一个远程文件而我找不到直接的解释来说明如何实现这么简单的事情。

 QFile jsonFile("https://myserver.com/myfile.json");
 QUrl jsonFile("https://myserver.com/myfile.json");

还有很多其他方法,包括QTextStream和我认为可以做的任何其他方法,如this,这似乎超出了我想要做的事情。但是一切都要归还......

 QIODevice::read: device not open

......或者是其他一些错误让我知道我搞砸了多少。

有人可以把我从痛苦中解救出来吗?

**编辑**

使用QNetwork libs,但现在在expected expression行上出现QObject::connect错误?

 QNetworkAccessManager manager;
    QNetworkRequest request(QUrl("https://myserver.com/myfile.json"));
    QNetworkReply *reply = manager.get(request);

    QObject::connect(reply, &QNetworkReply::finished, [&]() {
        QByteArray data = reply->readAll();

        QJsonDocument doc = QJsonDocument::fromJson(data);
        QJsonObject jObject = doc.object();
        QVariantMap json_map = jObject.toVariantMap();

        QString getNow = json_map["now"].toString();
        QString getImage = json_map["image"].toString();
        QString getNext = json_map["next"].toString();

        ui->live1->setText(getNow);
        ui->live2->setText(getImage);
        ui->live3->setText(getNext);

        reply->deleteLater();
    });

**编辑2 **

我刚刚意识到我需要包含C ++ 11编译器

 CONFIG += c++11

但现在它只是精神错乱的SSL错误

 qt.network.ssl: QSslSocket: cannot resolve TLSv1_1_client_method
 qt.network.ssl: QSslSocket: cannot resolve TLSv1_2_client_method
 qt.network.ssl: QSslSocket: cannot resolve TLSv1_1_server_method
 qt.network.ssl: QSslSocket: cannot resolve TLSv1_2_server_method
 qt.network.ssl: QSslSocket: cannot resolve SSL_select_next_proto
 qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
 qt.network.ssl: QSslSocket: cannot resolve SSL_get0_next_proto_negotiated

**编辑3 **

取得一些进展(我猜......)

似乎QT正在使用旧版本的SSL(根据文档可能不支持)。

当被问及SSL时,QDebug吐出了这个......

 Support SSL:   true
 Lib Version Number:  9470431
 Lib Version String:  "OpenSSL 0.9.8zh 14 Jan 2016"
 Lib Build Version Number:  268439727
 Lib Build Version String:  "OpenSSL 1.0.1j 15 Oct 2014"

所以现在我需要弄清楚如何让QT使用我机器上的新版本。

1 个答案:

答案 0 :(得分:0)

QFile不支持远程URI。你需要使用QtNetwork。

以下C ++ 11示例演示了如何从远程URI检索JSON:

QNetworkAccessManager manager;
QNetworkRequest request(QUrl("http://example.com/file.json"));
QNetworkReply *reply = manager.get(request);

QObject::connect(reply, &QNetworkReply::finished, [&]() {
    QByteArray data = reply->readAll();
    // do stuff with data
    reply->deleteLater();
});