Как отправить JSON с QTcpSocket - PullRequest
1 голос
/ 29 марта 2019

Я могу отправить объект 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 ]

1 голос
/ 29 марта 2019

Вы создаете один QJsonObject, а затем создаете QJsonArray, используя этот объект. Таким образом, конечный результат - один объект JSON с вложенным массивом только с одним объектом. Я не уверен, намереваетесь ли вы иметь только один объект в массиве или массив всех этих объектов.

И JSON, созданный в запросе, - это не то, что вы пытаетесь прочитать в ответ. В вашем запросе нет ключа levantamento или levan, поэтому вы не можете ничего найти в ответе. Вам нужно поработать над заполнением объектов в запросе 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"
1 голос
/ 29 марта 2019

Вы помещаете массив в качестве корня документа, поэтому сначала извлекайте его:

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

Проверьте, пуст ли он, если нет, получите первый элемент (объект levan ):

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

Теперь вы можете прочитать ключи объекта, например:

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

выведет:

QJsonValue (строка, "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"
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...