如何使用QTcpSocket发送JSON

时间:2019-03-29 10:11:11

标签: c++ json qt

我可以将JSON对象从客户端发送到服务器,但是无法从服务器上的JSON对象获取项目。

我尝试了一些示例,这些示例在我发现无法解决问题时发现。

发送JSON的代码:

QJsonObject levan{
    {"id",1},
    {"tipo","reforço"},
    {"ca", 10},
    {"cb",0},
    {"cc",0},
    {"cd",0},
    {"ce",0},
    {"cf",0},
    {"cg",0},
    {"ch",0},
};

QJsonArray jsarray {levan};
QJsonDocument jsDoc(jsarray);

QString jsString = QString::fromLatin1(jsDoc.toJson());

this->tcpSocket->write(jsString.toLatin1());

接收JSON的代码:

QString str = this->socket->readAll();

QJsonDocument jsonResponse = QJsonDocument::fromJson(str.toLatin1());
QJsonObject jsonObject = jsonResponse.object();
QJsonArray jsonArray = jsonObject["levantamento"].toArray();

qDebug()<< jsonResponse.object().value("levan");

if (jsonResponse.array().empty()) {
    qDebug() << "empty";
}

我可以将JSON呈现为文本,但无法从JSON中获取项目。

2 个答案:

答案 0 :(得分:0)

您将数组作为文档根,因此请首先检索它:

QJsonDocument jsonResponse = QJsonDocument::fromJson(str.toLatin1());
QJsonArray jsonArray = jsonResponse.array();

检查其是否为空,如果没有,则获取第一项( levan 对象):

if(!jsonArray.isEmpty())
{
    QJsonObject jsonObject = jsonArray.first().toObject();

您现在可以读取对象键,例如:

    qDebug()<< jsonObject.value("tipo");

将打印:

  

QJsonValue(string,“reforço”)

请注意, levan 不是键,而是变量名。所以这行:

jsonResponse.object().value("levan");

将永远无法工作。

如果问题仍然存在,这里有一些提示可以调试您的代码。

首先,以这种方式检查解析错误:

QJsonParseError parseError;
QJsonDocument jsonResponse = QJsonDocument::fromJson(str.toLatin1(), &parseError);
if(parseError.error != QJsonParseError::NoError)
{
    qDebug() << "Parse error: " << parseError.errorString();
}

如果发生这种情况,只需检查字符串(最好:无论如何都要检查),以查看其中的内容:

qDebug() << str.toLatin1().data();

预期输出为:

[
    {
        "ca": 10,
        "cb": 0,
        "cc": 0,
        "cd": 0,
        "ce": 0,
        "cf": 0,
        "cg": 0,
        "ch": 0,
        "id": 1,
        "tipo": "reforço"
    }
]

答案 1 :(得分:0)

您要创建一个QJsonObject,然后使用该对象创建QJsonArray。因此,最终输出是一个JSON对象,该JSON对象的嵌套数组只有一个对象。我不确定您是否打算在数组中仅包含一个对象或所有这些对象组成一个数组。

而且,在请求中创建的JSON不是您要尝试读取的内容。您的请求中没有密钥levantamentolevan,因此您找不到与之对应的任何内容。您需要处理请求JSON中的对象填充。以下示例将您的一些测试数据用于请求填充和响应提取。希望有帮助!

示例:

#include <QDebug>
#include <QString>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

int main()
{
    // Request: Create JSON objects and array of objects

    const auto jArrKey = "levan";
    const auto jTstKey = "test";

    const auto jRqObj1 = QJsonObject{ { "id", 1 } };
    const auto jRqObj2 = QJsonObject{ { "cb", 0 } };
    const auto jRqObj3 = QJsonObject{ { "cc", 0 } };
    const auto jReqArr = QJsonArray{ jRqObj1, jRqObj2, jRqObj3 };

    const auto jTstObj = QJsonObject{ { "Hello", "World" } };

    const auto jReqObj = QJsonObject{ { jArrKey, jReqArr }, { jTstKey, jTstObj } };
    const auto jReqDoc = QJsonDocument{ jReqObj };

    const auto jReqStr = QString::fromLatin1( jReqDoc.toJson() );
    qDebug() << "Request:\n" << qPrintable( jReqStr );

    // Response: Read JSON document and inspect its elements

    const auto jRspDoc = QJsonDocument::fromJson( jReqStr.toLatin1() );
    const auto jRspObj = jRspDoc.object();
    const auto jRspArr = jRspObj[ jArrKey ].toArray();
    const auto jRspTst = jRspObj[ jTstKey ].toObject();

    qDebug() << "Response:" << jRspArr;
    qDebug() << "Test Obj:" << jRspTst;
    qDebug() << ">> Hello:" << jRspTst.value( "Hello" ).toString();

    return 0;
}

输出:

Request:
 {
    "levan": [
        {
            "id": 1
        },
        {
            "cb": 0
        },
        {
            "cc": 0
        }
    ],
    "test": {
        "Hello": "World"
    }
}

Response: QJsonArray([{"id":1},{"cb":0},{"cc":0}])
Test Obj: QJsonObject({"Hello":"World"})
>> Hello: "World"