Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Json sending and receiving and finding keys inside json



  • so here im sending a response when "001" (Request Info) is sent to the ESP32

        DynamicJsonDocument doc2(256);                       // Init Dynamic Json Document
        String jsonData;                                     // Make Json Variable To Store Outgoing Json
    
        if (doc["001"] && doc["001"] == "yes") {             // Request Info
    
            Serial.println("Requested Info");
    
            doc2["300"] = DeviceType;                        // Device Type
            doc2["301"] = DeviceName;                        // Device Name
            doc2["303"] = DeviceLEDType;                     // Device LED Type
    
            serializeJson(doc2, jsonData);                   // Serialize Json
            webSocket.sendTXT(num, jsonData);                // Send Json Data Via Socket
            Serial.println(jsonData);
        }
    

    Printing out jsonData it looks like this

    {"300":"ESP32","301":"Matrix Display","303":"Matrix"}
    

    perfect! now on the other end

    void MainWindow::onRequestedInfoReceived(QString message)
    {
        qDebug() << "[SOCKET][INFO] Requested Info : " << message;
    }
    

    Printing out message looks this

    [SOCKET][INFO] Requested Info :  "{\"300\":\"ESP32\",\"301\":\"Matrix Display\",\"303\":\"Matrix\"}"
    

    why the \ because of QString?



  • @Kris-Revi
    What is your question? Yes, qDebug() displaying a string shows embedded double-quote characters as \".



  • my question is does this affect when i try to

        QJsonDocument doc = QJsonDocument::fromJson(message);
        QJsonValue test = doc.object().value("001");
    

    also this gives me no viable conversion from 'QString' to 'const QByteArray'



  • @Kris-Revi
    [static]QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = nullptr) accepts input as a QByteArray:

    Parses json as a UTF-8 encoded JSON document,

    I don't know where you got your void MainWindow::onRequestedInfoReceived(QString message) with QString parameter from, data is sent around (serial ports, sockets) as bytes, so that's what it should be. If necessary, don't forget there is QByteArray QString::toUtf8() const.



  • i can only set QString void MainWindow::onRequestedInfoReceived(QString message) it wont allow me to set QByteArray or bytes or anything realy :S



  • @Kris-Revi
    I assume that method is a slot, and since you don't show the signal connection I cannot comment.

    So did you try the QByteArray QString::toUtf8() const?



  • @JonB
    this is the Q_SIGNAL

    void onRequestedInfoReceived(QString message);
    

    this is the Q_SLOT

    void onRequestedInfoReceived(QString message);
    


  • @Kris-Revi
    Fine.
    And for the third time of suggesting/asking: how are you finding using QByteArray QString::toUtf8() const on it then works for making your QString message acceptable to QJsonDocument::fromJson() with no error? I'm not going to repeat this further.



  • @JonB wait... QByteArray QString::toUtf8() const ? :S



  • @JonB did this

    void MainWindow::onRequestedInfoReceived(QString message)
    {
        //qDebug() << "[SOCKET][INFO] Requested Info : " << message;
    
        QByteArray messageArray = message.toUtf8();
    
        QJsonDocument doc = QJsonDocument::fromJson(messageArray);
    
        QJsonValue test = doc.object().value("001");
    
        qDebug() << "Board Type : " << test;
    }
    

    got

    Board Type :  QJsonValue(undefined)
    


  • What does

    qDebug().noquote() << message; 
    

    do?
    It might remove the quoting altogether and make it more readable.



  • @Kris-Revi
    Print out things like QJsonDocument::isNull(), QJsonDocument::isObject(), QJsonDocument::object(). What about looking at doc.object().keys() to see what is actually in there?



  • the printing out part is realy not an issue :) i just noticed that there was added \ in the print out and i thought that that would affect the way im searching for keys!


  • Lifetime Qt Champion

    Hi,

    Side questions:

    • Where are you getting that JSON data from ?
    • Do you receive it directly a QString ?
    • If not, why not change the slot signature to use a QByteArray, or even better use a const reference on a QByteArray.


  • @SGaist scroll to the top and you will see where i get that json from and the answer to the QString question :)



  • @Kris-Revi said in Json sending and receiving and finding keys inside json:

    the printing out part is realy not an issue :)

    Well, yes/no, but You are wanting to get back the doc2["300"] = DeviceType/"300":"ESP32" you put in, and you say you're not succedding with doc.object().value("001"), so you need to look at what the document you have parsed back has come out like.

    EDIT Hang on, aren't you looking for the wrong thing? When you showed the string received earlier it was:

    [SOCKET][INFO] Requested Info :  "{\"300\":\"ESP32\",\"301\":\"Matrix Display\",\"303\":\"Matrix\"}"
    

    So why are you now asking for doc.object().value("001"); ? QJsonValue(undefined) looks about the right for that!



  • I'm guessing that OP get his data from QWebSocket.
    So if he connects QWebSocket::textMessageReceived signal, then he'll get directly a QString.



  • @JonB you are actualy correct! xD im looking for "303" NOT the "001" that is "Request Info"


Log in to reply