Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. JSon Parsing

JSon Parsing

Scheduled Pinned Locked Moved Solved General and Desktop
11 Posts 3 Posters 4.4k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    jemazter
    wrote on last edited by
    #1

    Hello.

    I developing a application that makes a request to an server and i get the following response (https://octopart.com/api/v3/parts/match?apikey=EXAMPLE_KEY&queries=[{"mpn":"SN74S74N"}]&pretty_print=true&include[]=specs&include[]=specs). I need to access the variable "results">"specs">"case_package">"value". This is my code:

    void MainWindow::octopartData(QByteArray data)
    {
        QString dataString;
        dataString = data;
        // ui->textBrowser->append(data); //DEBUG PURPOSES
        QJsonDocument temp = QJsonDocument::fromJson(data);
        QJsonObject jObject = temp.object();
        QVariantMap mainMap = jObject.toVariantMap();
        QVariantMap results = mainMap["results"].toMap();
        QVariantMap specs = results["specs"].toMap();
        QVariantMap case_package = specs["case_package"].toMap();
        qDebug()<<case_package["value"];
    }
    

    But is not working, debug is showing only QVariant(Invalid). I would like to get some advice to solve this problem.

    Thanks in advance.

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #2

      use toObject instead of toVariantMap

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      2
      • mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by mrjj
        #3

        Hi
        Why you need to convert to
        Object.toVariantMap();

        If you take

          qDebug() << jObject["message"] <<  jObject["__class__"];
        

        Its not the values?

        See small sample here
        https://forum.qt.io/topic/74715/work-with-json-format/3

        Its parsing
        "[ { "Name" : "Bob", "Phonenumber" : 123 },
        { "Name" : "Alice", "Phonenumber" : 321 } ]"

        so almost the same :)

        J 1 Reply Last reply
        1
        • mrjjM mrjj

          Hi
          Why you need to convert to
          Object.toVariantMap();

          If you take

            qDebug() << jObject["message"] <<  jObject["__class__"];
          

          Its not the values?

          See small sample here
          https://forum.qt.io/topic/74715/work-with-json-format/3

          Its parsing
          "[ { "Name" : "Bob", "Phonenumber" : 123 },
          { "Name" : "Alice", "Phonenumber" : 321 } ]"

          so almost the same :)

          J Offline
          J Offline
          jemazter
          wrote on last edited by
          #4

          @mrjj said in JSon Parsing:

          Hi
          Why you need to convert to
          Object.toVariantMap();

          If you take

            qDebug() << jObject["message"] <<  jObject["__class__"];
          

          Its not the values?

          See small sample here
          https://forum.qt.io/topic/74715/work-with-json-format/3

          Its parsing
          "[ { "Name" : "Bob", "Phonenumber" : 123 },
          { "Name" : "Alice", "Phonenumber" : 321 } ]"

          so almost the same :)

          Hi.

          I'm converting it to VariantMap because i was following this http://blog.linux4us.org/2013/09/05/parse-json-with-qjson-in-qt5/. The data i have is like the following: https://paste2.org/yIBBGm8p

          I think the difference between my data and the example you posted is that in my data the value i want to read ("value") is "inside" "case_package", that is inside "specs" that is inside "results".

          1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by VRonin
            #5

            Edit2

            I corrected the code. You did not realise some of the values were arrays and that there was an "items" object in-between.

            You can use tools like http://jsonviewer.stack.hu/ to have a clearer view of what you are looking at

            void MainWindow::octopartData(QByteArray data)
            {
                const QJsonDocument temp = QJsonDocument::fromJson(data);
                const QJsonObject jObject = temp.object();
                const QJsonArray results = jObject["results"].toArray();
            
                for(const QJsonValue& res : results){
                    const QJsonObject result= res.toObject();
                    const QJsonArray items = result["items"].toArray();
                    for(const QJsonValue& ite : items){
                        const QJsonObject item= ite.toObject();
                        const QJsonObject specs = item["specs"].toObject();
                        const QJsonObject case_package = specs["case_package"].toObject();
                        const QJsonArray value = case_package["value"].toArray();
                        for(auto& val : value){
                            qDebug() << val;
                        }
                    }
                }
            }
            

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            J 1 Reply Last reply
            3
            • VRoninV VRonin

              Edit2

              I corrected the code. You did not realise some of the values were arrays and that there was an "items" object in-between.

              You can use tools like http://jsonviewer.stack.hu/ to have a clearer view of what you are looking at

              void MainWindow::octopartData(QByteArray data)
              {
                  const QJsonDocument temp = QJsonDocument::fromJson(data);
                  const QJsonObject jObject = temp.object();
                  const QJsonArray results = jObject["results"].toArray();
              
                  for(const QJsonValue& res : results){
                      const QJsonObject result= res.toObject();
                      const QJsonArray items = result["items"].toArray();
                      for(const QJsonValue& ite : items){
                          const QJsonObject item= ite.toObject();
                          const QJsonObject specs = item["specs"].toObject();
                          const QJsonObject case_package = specs["case_package"].toObject();
                          const QJsonArray value = case_package["value"].toArray();
                          for(auto& val : value){
                              qDebug() << val;
                          }
                      }
                  }
              }
              
              J Offline
              J Offline
              jemazter
              wrote on last edited by
              #6

              @VRonin said in JSon Parsing:

              Edit2

              I corrected the code. You did not realise some of the values were arrays and that there was an "items" object in-between.

              You can use tools like http://jsonviewer.stack.hu/ to have a clearer view of what you are looking at

              void MainWindow::octopartData(QByteArray data)
              {
                  const QJsonDocument temp = QJsonDocument::fromJson(data);
                  const QJsonObject jObject = temp.object();
                  const QJsonArray results = jObject["results"].toArray();
              
                  for(const QJsonValue& res : results){
                      const QJsonObject result= res.toObject();
                      const QJsonArray items = result["items"].toArray();
                      for(const QJsonValue& ite : items){
                          const QJsonObject item= ite.toObject();
                          const QJsonObject specs = item["specs"].toObject();
                          const QJsonObject case_package = specs["case_package"].toObject();
                          const QJsonArray value = case_package["value"].toArray();
                          for(auto& val : value){
                              qDebug() << val;
                          }
                      }
                  }
              }
              

              Hello.

              Thanks, it's working now. Sorry for the newbie question, but what the 3 '"fors" are doing exactly?

              And just one more question, if inside "items" i have "0" and "1", how can i select one of these itens?

              1 Reply Last reply
              0
              • VRoninV Offline
                VRoninV Offline
                VRonin
                wrote on last edited by
                #7

                the answers are related:

                but what the 3 '"fors" are doing exactly?

                they iterate over every item of the array

                if inside "items" i have "0" and "1", how can i select one of these itens?

                instead of iterating over all of them (with the for) you can use at() to select a specific one, for example: const QJsonObject item= items.at(0).toObject();

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                3
                • J Offline
                  J Offline
                  jemazter
                  wrote on last edited by
                  #8

                  Thanks a lot, @VRonin.

                  1 Reply Last reply
                  0
                  • J Offline
                    J Offline
                    jemazter
                    wrote on last edited by
                    #9

                    Sorry, for "reviving" the topic, but i have one more doubt.

                    I'm trying to acces the property "mpn" from "itens" using the following code:

                    void MainWindow::octopartData(QByteArray data)
                    {
                        const QJsonDocument temp = QJsonDocument::fromJson(data);
                        const QJsonObject jObject = temp.object();
                        const QJsonArray results = jObject["results"].toArray();
                        for(const QJsonValue& res : results)
                    {
                            const QJsonObject result= res.toObject();
                            const QJsonArray items = result["items"].toArray();
                            const QJsonObject item = items.at(0).toObject();
                            const QJsonArray mpn = item["mpn"].toArray();
                            qDebug() << mpn;
                        }
                    }
                    

                    But i only get an empty array. Did i did something wrong when accessing the data?

                    1 Reply Last reply
                    0
                    • mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      Hi
                      "mpn": "SN74S74N",
                      Do not look like array to me.
                      Looks like a value.
                      http://doc.qt.io/qt-5/qjsonvalue.html#details
                      "The type of the value can be queried with type() or accessors like isBool(), isString(), and so on. "

                      so try the type() and see what you got :)

                      J 1 Reply Last reply
                      2
                      • mrjjM mrjj

                        Hi
                        "mpn": "SN74S74N",
                        Do not look like array to me.
                        Looks like a value.
                        http://doc.qt.io/qt-5/qjsonvalue.html#details
                        "The type of the value can be queried with type() or accessors like isBool(), isString(), and so on. "

                        so try the type() and see what you got :)

                        J Offline
                        J Offline
                        jemazter
                        wrote on last edited by jemazter
                        #11

                        @mrjj said in JSon Parsing:

                        Hi
                        "mpn": "SN74S74N",
                        Do not look like array to me.
                        Looks like a value.
                        http://doc.qt.io/qt-5/qjsonvalue.html#details
                        "The type of the value can be queried with type() or accessors like isBool(), isString(), and so on. "

                        so try the type() and see what you got :)

                        It was a string after all. Now my code is working as bellow:

                        void MainWindow::octopartData(QByteArray data)
                        {
                            const QJsonDocument temp = QJsonDocument::fromJson(data);
                            const QJsonObject jObject = temp.object();
                            const QJsonArray results = jObject["results"].toArray();
                            for(const QJsonValue& res : results)
                        {
                                const QJsonObject result= res.toObject();
                                const QJsonArray items = result["items"].toArray();
                                const QJsonObject item = items.at(0).toObject();
                                const QString mpn = item["mpn"].toString();
                                qDebug() << mpn;
                            }
                        }
                        

                        Thanks a lot for the help.

                        1 Reply Last reply
                        1

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved