Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. QML and JSON

QML and JSON

Scheduled Pinned Locked Moved QML and Qt Quick
23 Posts 12 Posters 57.8k Views 1 Watching
  • 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.
  • D Offline
    D Offline
    DenisKormalev
    wrote on last edited by
    #12

    SimonJudge, all depends on your JSON size. If it is not big, than JS way is ok for you. But if it contains a lot of elements, then using c++ will be better.

    1 Reply Last reply
    0
    • L Offline
      L Offline
      luizpaulo
      wrote on last edited by
      #13

      Hey a good Qt/C++ JSON parser is avaliable with a LGPL licence: http://qjson.sourceforge.net/
      Might be what you need.

      1 Reply Last reply
      0
      • F Offline
        F Offline
        fcrochik
        wrote on last edited by
        #14

        [quote author="luizpaulo" date="1291470389"]Hey a good Qt/C++ JSON parser is avaliable with a LGPL licence: http://qjson.sourceforge.net/
        Might be what you need.[/quote]

        I saw it when I was working on a simple json parser but decided against it. Depending on the task you can get the same result w/o any additional dependencies - just using the script module.

        Certified Specialist & Qt Ambassador <a href="http://www.crochik.com">Maemo, Meego, Symbian, Playbook, RaspberryPi, Desktop... Qt everywhere!</a>

        1 Reply Last reply
        0
        • D Offline
          D Offline
          dridk
          wrote on last edited by
          #15

          Hello here is my point of view! I tested everything! XMLModel, javascript XML parser, C++ side parser etc...

          Do Not use C++ Json parser : Because exchange data between c++ and QML is slow

          Make a Javascript parser ! It's more easy with eval ! Here is an example :

          Json data
          @
          {"index":["all"],"flux":{"all":[{"data":{"title":"boris","icon":"icon.png"}]}}
          @

          QML side : main.qml
          @
          import QtQuick 1.0
          import "parser.js" as JS

          Item {
          id:root
          width: 360
          height: 640

          Component.onCompleted: JS.load()
          
          
          ListModel {  id:listModel }
          
          ListView {
              id:view
              anchors.fill:parent
              model : listModel
              delegate: Rectangle {
                   width:parent.width
                   height:80
                   Text {
                   anchors.center:parent
                   text: title
                   }
                 
              }
          }
          

          }
          @

          javascript side : parser.js

          @
          function load() {

          listModel.clear();
          var xhr = new XMLHttpRequest();
          

          xhr.open("GET","http://data.json",true);
          xhr.onreadystatechange = function()
          {
          if ( xhr.readyState == xhr.DONE)
          {
          if ( xhr.status == 200)
          {
          var jsonObject = eval('(' + xhr.responseText + ')');
          loaded(jsonObject)
          }
          }
          }
          xhr.send();
          }

          function loaded(jsonObject)
          {
          for ( var index in jsonObject.flux.all )
          {
          listModel.append({
          "title" : jsonObject.flux.all[index].data["title"],
          "icon" : jsonObject.flux.all[index].data["icon"]});
          }

          // get directly the json object. Should work but not tested
          //listModel.append({jsonObject.flux.all});

          }
          @

          Nothing in Biology Makes Sense Except in the Light of Evolution

          1 Reply Last reply
          1
          • F Offline
            F Offline
            fcrochik
            wrote on last edited by
            #16

            It is a little surprising to me that you found that exchanging data between C++ and QML to be slow.

            I can imagine that maybe the C++ xml parser you tried is slow but I can't imagine creating the model in c++ can be any slower than creating it using Javascript.

            Another scenario I can imagine it would slow things is if you are adding elements to a model that is already in use.

            I am just curious of the why...

            Certified Specialist & Qt Ambassador <a href="http://www.crochik.com">Maemo, Meego, Symbian, Playbook, RaspberryPi, Desktop... Qt everywhere!</a>

            1 Reply Last reply
            0
            • D Offline
              D Offline
              dridk
              wrote on last edited by
              #17

              That what I m thinking before! But a a guy said me that, and I trust him ... He said me C++ parsing is faster, but exchanging between binary and script is slower.

              So, no matter, the javascript method is a little bit more easy than creating a c++ model ! :)

              Nothing in Biology Makes Sense Except in the Light of Evolution

              1 Reply Last reply
              0
              • R Offline
                R Offline
                remy_david
                wrote on last edited by
                #18

                I am also not so happy with the performances of my C++ model but I can't precisely say what's slowing down.

                1 Reply Last reply
                0
                • AlicemirrorA Offline
                  AlicemirrorA Offline
                  Alicemirror
                  wrote on last edited by
                  #19

                  Hi to all,

                  I see that the interest in json parsing is always present. I tried to manage qjson but it seems too complex for what can be done and I have developed a method that I am experiencing very efficient and reliable. It concerns of a C++ class and a very short function in js to be used by QML. If someone is interested I can explain it in details in a wiki page. For now the method is integrated in a project but it will be one of the new features of Qt-Complex 2.0 that I am preparing.

                  Take a look to http://projects.developer.nokia.com/pricemyhouse.

                  Enrico Miglino (aka Alicemirror)
                  Balearic Dynamics
                  Islas Baleares, Ibiza (Spain)
                  www.balearicdynamics.com

                  1 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    peppelorum
                    wrote on last edited by
                    #20

                    Please don't use eval when parsing json-data, you are actually running the code, so if something nasty is in the reply you get, well...

                    I've made a small library that plays nice with QML, for making the whole ajax-thingie a bit easier, you can check it out at https://github.com/peppelorum/ajaxmee

                    1 Reply Last reply
                    0
                    • C Offline
                      C Offline
                      Chuck Gao
                      wrote on last edited by
                      #21

                      I think the simplest way to parse and turn json data to C++ model is using QScriptEngine. Please see:
                      @
                      QScriptValue json = m_scriptEngine->evaluate("JSON.parse").call(QScriptValue(), QScriptValueList() << jsonString);
                      QVariantList xxxList = json.toVariant().toList();
                      or
                      QVariantMap xxxMap = json.toVariant().toMap();
                      .....
                      Then, do parse
                      .....
                      @

                      And, in the code, m_scriptEngine is your QScriptEngine, and jsonString is your json data

                      Chuck

                      1 Reply Last reply
                      0
                      • F Offline
                        F Offline
                        fcrochik
                        wrote on last edited by
                        #22

                        QML "includes" a JSON parser. You can just use, without having to include anything:

                        @var obj = JSON.parse( myJSONString );@

                        "See json.org for more details":http://www.json.org/js.html

                        Of course eval can do the trick as well but it is risky and the JSON parser maybe optimized.

                        Certified Specialist & Qt Ambassador <a href="http://www.crochik.com">Maemo, Meego, Symbian, Playbook, RaspberryPi, Desktop... Qt everywhere!</a>

                        1 Reply Last reply
                        0
                        • K Offline
                          K Offline
                          kromain
                          wrote on last edited by
                          #23

                          For anybody still interested, I've just published a JSONListModel component that works just like XMLListModel, but for JSON data instead. It's all pure QML/Javascript, and it even supports queries via JSONPath (XPath for JSON).

                          You can read more about it there: "Devnet article":http://qt-project.org/wiki/JSONListModel

                          Romain Pokrzywka
                          KDAB - http://www.kdab.com

                          1 Reply Last reply
                          0

                          • Login

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