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. Qt with BSON
Qt 6.11 is out! See what's new in the release blog

Qt with BSON

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 3 Posters 3.1k Views 3 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.
  • M Offline
    M Offline
    Marek
    wrote on last edited by Marek
    #1

    Hi all,

    Can someone recommend good solution for BSON with Qt ? I'm targetting Android and iOS platform.
    I Need to exchange data with some device which is using BSON.

    Best Regards
    Marek

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

      Hi
      I can recommend
      https://github.com/nlohmann/json
      It also supports BSON but not the full spec.
      But should be fast to test if its enough for your device.
      Its a wonderful JSON library. (IMHO)

      M 1 Reply Last reply
      6
      • mrjjM mrjj

        Hi
        I can recommend
        https://github.com/nlohmann/json
        It also supports BSON but not the full spec.
        But should be fast to test if its enough for your device.
        Its a wonderful JSON library. (IMHO)

        M Offline
        M Offline
        Marek
        wrote on last edited by
        #3

        @mrjj Thanks it looks well documented.
        I only need to exchange some data that was previuosly send as ASCII, so I hope I don't need full spec.

        Best,
        Marek

        mrjjM 1 Reply Last reply
        1
        • M Marek

          @mrjj Thanks it looks well documented.
          I only need to exchange some data that was previuosly send as ASCII, so I hope I don't need full spec.

          Best,
          Marek

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by mrjj
          #4

          @Marek
          Its extremely well documented and was very nice to work with.
          Also has special c++ syntax that is very handy to make test with.

          json j2 = {
            {"pi", 3.141},
            {"happy", true},
            {"name", "Niels"},
            {"nothing", nullptr},
            {"answer", {
              {"everything", 42}
            }},
            {"list", {1, 0, 2}},
            {"object", {
              {"currency", "USD"},
              {"value", 42.99}
            }}
          };
          

          On top of that it was pretty fast too.
          Well im not sure what is actually missing but i think it can serialise to bSON most of JSON so hopefully its
          fine.

          Update:
          Btw, Qt JSON can also save as binary. So if you can also alter the sender, you can use that also.

          M 1 Reply Last reply
          3
          • mrjjM mrjj

            @Marek
            Its extremely well documented and was very nice to work with.
            Also has special c++ syntax that is very handy to make test with.

            json j2 = {
              {"pi", 3.141},
              {"happy", true},
              {"name", "Niels"},
              {"nothing", nullptr},
              {"answer", {
                {"everything", 42}
              }},
              {"list", {1, 0, 2}},
              {"object", {
                {"currency", "USD"},
                {"value", 42.99}
              }}
            };
            

            On top of that it was pretty fast too.
            Well im not sure what is actually missing but i think it can serialise to bSON most of JSON so hopefully its
            fine.

            Update:
            Btw, Qt JSON can also save as binary. So if you can also alter the sender, you can use that also.

            M Offline
            M Offline
            Marek
            wrote on last edited by
            #5

            @mrjj Qt JSON binary format is something else.
            According to this blog Q&A https://blog.qt.io/blog/2018/05/31/serialization-in-and-with-qt/ at the end, Qt JSON binary data is not BSON it is some internal format.

            Best,
            Marek

            mrjjM 1 Reply Last reply
            0
            • M Marek

              @mrjj Qt JSON binary format is something else.
              According to this blog Q&A https://blog.qt.io/blog/2018/05/31/serialization-in-and-with-qt/ at the end, Qt JSON binary data is not BSON it is some internal format.

              Best,
              Marek

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by mrjj
              #6

              @Marek
              Hi
              Yes, i know. its just binary.
              I would just mention it - just in case. :)

              M 1 Reply Last reply
              1
              • mrjjM mrjj

                @Marek
                Hi
                Yes, i know. its just binary.
                I would just mention it - just in case. :)

                M Offline
                M Offline
                Marek
                wrote on last edited by
                #7

                @mrjj project you recommended works fine, quick integration, nice

                Unfortunatelly I have problem, device I'm communicating with does not use JSON, they are using BSON without JSON.
                I have compiled libbson for android and I'm including static lib into my project it compiles fine.

                Question is: since this is C library, I will have to use wrappers for each function ?
                like:

                extern "C" {
                #include "bson/bson.h"
                };
                

                Best,
                Marek

                mrjjM 1 Reply Last reply
                0
                • M Marek

                  @mrjj project you recommended works fine, quick integration, nice

                  Unfortunatelly I have problem, device I'm communicating with does not use JSON, they are using BSON without JSON.
                  I have compiled libbson for android and I'm including static lib into my project it compiles fine.

                  Question is: since this is C library, I will have to use wrappers for each function ?
                  like:

                  extern "C" {
                  #include "bson/bson.h"
                  };
                  

                  Best,
                  Marek

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @Marek
                  Hi
                  you mean libbson is a c library ?
                  In that case, most likely yes, use extern.

                  M 1 Reply Last reply
                  1
                  • mrjjM mrjj

                    @Marek
                    Hi
                    you mean libbson is a c library ?
                    In that case, most likely yes, use extern.

                    M Offline
                    M Offline
                    Marek
                    wrote on last edited by Marek
                    #9

                    @mrjj
                    Hi
                    To clarify my problem, https://github.com/nlohmann/json has some limitations, not all data types are converted from BSON to JSON for instance binary and int64 are not
                    data_types link

                    So I need to use libbson and it works on Linux, all cool, I have problem with android.
                    When I compile I got errors:

                    /opt/mongo-c-driver/src/libbson/src/bson/bson.c:0: error: undefined reference to 'stderr'
                    /opt/mongo-c-driver/src/libbson/src/bson/bson.c:0: error: undefined reference to 'stderr'
                    /opt/mongo-c-driver/src/libbson/src/bson/bson.c:0: error: undefined reference to 'stderr'
                    /opt/mongo-c-driver/src/libbson/src/bson/bson.c:0: error: undefined reference to 'stderr'
                    /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:235: error: undefined reference to 'rand_r'
                    /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:235: error: undefined reference to 'rand_r'
                    /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:235: error: undefined reference to 'rand_r'
                    clang++: error: linker command failed with exit code 1 (use -v to see invocation)
                    

                    They show up when I actually start to use code like:

                    if ((b = bson_new_from_data (reinterpret_cast<uint8_t*>(data.data()), data.size()))) {
                    ....
                    

                    They don't show up when I just include header and make variables

                    extern "C" {
                    #include "bson/forwarding/bson.h"
                    }
                    bson_t *b;
                    bson_iter_t iter;
                    

                    I was trying NDK r19c and r20
                    I have seen someone saying about Unified Headers but it was with NDK 15

                    I'm compiling libbson with this command:

                    cmake . -DCMAKE_SYSTEM_NAME=Android -DCMAKE_TOOLCHAIN_FILE=/opt/Android/Ndk/android-ndk-r19c/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28
                    -- Check for working C compiler: /opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
                    -- Check for working C compiler: /opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- works
                    -- Detecting C compiler ABI info
                    -- Detecting C compiler ABI info - done
                    -- Detecting C compile features
                    -- Detecting C compile features - done
                    -- No CMAKE_BUILD_TYPE selected, defaulting to RelWithDebInfo
                    file VERSION_CURRENT contained BUILD_VERSION 1.15.0-20190711+gitf34ff4aa6b
                      -- Using bundled libbson
                    libbson version (from VERSION_CURRENT file): 1.15.0-pre
                    -- Check if the system is big endian
                    -- Searching 16 bit integer
                    -- Looking for sys/types.h
                    -- Looking for sys/types.h - found
                    -- Looking for stdint.h
                    -- Looking for stdint.h - found
                    -- Looking for stddef.h
                    -- Looking for stddef.h - found
                    -- Check size of unsigned short
                    -- Check size of unsigned short - done
                    -- Using unsigned short
                    -- Check if the system is big endian - little endian
                    -- Looking for snprintf
                    -- Looking for snprintf - found
                    -- Looking for reallocf
                    -- Looking for reallocf - not found
                    -- Performing Test BSON_HAVE_TIMESPEC
                    -- Performing Test BSON_HAVE_TIMESPEC - Success
                    --     struct timespec found
                    -- Looking for gmtime_r
                    -- Looking for gmtime_r - found
                    -- Looking for rand_r
                    -- Looking for rand_r - found
                    -- Looking for strings.h
                    -- Looking for strings.h - found
                    -- Looking for clock_gettime
                    -- Looking for clock_gettime - found
                    -- Looking for strnlen
                    -- Looking for strnlen - found
                    -- Looking for stdbool.h
                    -- Looking for stdbool.h - found
                    -- Looking for SYS_gettid
                    -- Looking for SYS_gettid - found
                    -- Looking for syscall
                    -- Looking for syscall - found
                    -- Performing Test HAVE_ATOMIC_32_ADD_AND_FETCH
                    -- Performing Test HAVE_ATOMIC_32_ADD_AND_FETCH - Success
                    -- Performing Test HAVE_ATOMIC_64_ADD_AND_FETCH
                    -- Performing Test HAVE_ATOMIC_64_ADD_AND_FETCH - Success
                    -- Looking for pthread.h
                    -- Looking for pthread.h - found
                    -- Looking for pthread_create
                    -- Looking for pthread_create - found
                    -- Found Threads: TRUE  
                    libmongoc version (from VERSION_CURRENT file): 1.15.0-pre
                    -- Searching for zlib CMake packages
                    -- Found ZLIB: /opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libz.a (found version "1.2.7") 
                    --   zlib found version "1.2.7"
                    --   zlib include path "/opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include"
                    --   zlib libraries "/opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libz.a"
                    -- Looking for include file unistd.h
                    -- Looking for include file unistd.h - found
                    -- Looking for include file stdarg.h
                    -- Looking for include file stdarg.h - found
                    -- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing:  OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) 
                    -- Searching for sasl/sasl.h
                    --   Not found (specify -DCMAKE_INCLUDE_PATH=/path/to/sasl/include for SASL support)
                    -- Searching for libsasl2
                    --   Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/sasl/lib for SASL support)
                    -- Check size of socklen_t
                    -- Check size of socklen_t - done
                    -- Looking for res_nsearch
                    -- Looking for res_nsearch - not found
                    -- Looking for res_search
                    -- Looking for res_search - found
                    -- Looking for sched_getcpu
                    -- Looking for sched_getcpu - not found
                    -- Detected parameters: accept (int, struct sockaddr *, socklen_t *)
                    -- Searching for compression library header snappy-c.h
                    --   Not found (specify -DCMAKE_INCLUDE_PATH=/path/to/snappy/include for Snappy compression)
                    -- No ICU library found, SASLPrep disabled for SCRAM-SHA-256 authentication.
                    -- If ICU is installed in a non-standard directory, define ICU_ROOT as the ICU installation path.
                    -- SSL disabled
                    -- SASL disabled
                    -- Configuring done
                    -- Generating done
                    -- Build files have been written to: /home/franki/apps/qt/mongo-c-driver
                    

                    Any idea how to solve this problem?

                    Best,
                    Marek

                    M 1 Reply Last reply
                    0
                    • M Marek

                      @mrjj
                      Hi
                      To clarify my problem, https://github.com/nlohmann/json has some limitations, not all data types are converted from BSON to JSON for instance binary and int64 are not
                      data_types link

                      So I need to use libbson and it works on Linux, all cool, I have problem with android.
                      When I compile I got errors:

                      /opt/mongo-c-driver/src/libbson/src/bson/bson.c:0: error: undefined reference to 'stderr'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson.c:0: error: undefined reference to 'stderr'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson.c:0: error: undefined reference to 'stderr'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson.c:0: error: undefined reference to 'stderr'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:235: error: undefined reference to 'rand_r'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:235: error: undefined reference to 'rand_r'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:235: error: undefined reference to 'rand_r'
                      clang++: error: linker command failed with exit code 1 (use -v to see invocation)
                      

                      They show up when I actually start to use code like:

                      if ((b = bson_new_from_data (reinterpret_cast<uint8_t*>(data.data()), data.size()))) {
                      ....
                      

                      They don't show up when I just include header and make variables

                      extern "C" {
                      #include "bson/forwarding/bson.h"
                      }
                      bson_t *b;
                      bson_iter_t iter;
                      

                      I was trying NDK r19c and r20
                      I have seen someone saying about Unified Headers but it was with NDK 15

                      I'm compiling libbson with this command:

                      cmake . -DCMAKE_SYSTEM_NAME=Android -DCMAKE_TOOLCHAIN_FILE=/opt/Android/Ndk/android-ndk-r19c/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28
                      -- Check for working C compiler: /opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
                      -- Check for working C compiler: /opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- works
                      -- Detecting C compiler ABI info
                      -- Detecting C compiler ABI info - done
                      -- Detecting C compile features
                      -- Detecting C compile features - done
                      -- No CMAKE_BUILD_TYPE selected, defaulting to RelWithDebInfo
                      file VERSION_CURRENT contained BUILD_VERSION 1.15.0-20190711+gitf34ff4aa6b
                        -- Using bundled libbson
                      libbson version (from VERSION_CURRENT file): 1.15.0-pre
                      -- Check if the system is big endian
                      -- Searching 16 bit integer
                      -- Looking for sys/types.h
                      -- Looking for sys/types.h - found
                      -- Looking for stdint.h
                      -- Looking for stdint.h - found
                      -- Looking for stddef.h
                      -- Looking for stddef.h - found
                      -- Check size of unsigned short
                      -- Check size of unsigned short - done
                      -- Using unsigned short
                      -- Check if the system is big endian - little endian
                      -- Looking for snprintf
                      -- Looking for snprintf - found
                      -- Looking for reallocf
                      -- Looking for reallocf - not found
                      -- Performing Test BSON_HAVE_TIMESPEC
                      -- Performing Test BSON_HAVE_TIMESPEC - Success
                      --     struct timespec found
                      -- Looking for gmtime_r
                      -- Looking for gmtime_r - found
                      -- Looking for rand_r
                      -- Looking for rand_r - found
                      -- Looking for strings.h
                      -- Looking for strings.h - found
                      -- Looking for clock_gettime
                      -- Looking for clock_gettime - found
                      -- Looking for strnlen
                      -- Looking for strnlen - found
                      -- Looking for stdbool.h
                      -- Looking for stdbool.h - found
                      -- Looking for SYS_gettid
                      -- Looking for SYS_gettid - found
                      -- Looking for syscall
                      -- Looking for syscall - found
                      -- Performing Test HAVE_ATOMIC_32_ADD_AND_FETCH
                      -- Performing Test HAVE_ATOMIC_32_ADD_AND_FETCH - Success
                      -- Performing Test HAVE_ATOMIC_64_ADD_AND_FETCH
                      -- Performing Test HAVE_ATOMIC_64_ADD_AND_FETCH - Success
                      -- Looking for pthread.h
                      -- Looking for pthread.h - found
                      -- Looking for pthread_create
                      -- Looking for pthread_create - found
                      -- Found Threads: TRUE  
                      libmongoc version (from VERSION_CURRENT file): 1.15.0-pre
                      -- Searching for zlib CMake packages
                      -- Found ZLIB: /opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libz.a (found version "1.2.7") 
                      --   zlib found version "1.2.7"
                      --   zlib include path "/opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include"
                      --   zlib libraries "/opt/Android/Ndk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libz.a"
                      -- Looking for include file unistd.h
                      -- Looking for include file unistd.h - found
                      -- Looking for include file stdarg.h
                      -- Looking for include file stdarg.h - found
                      -- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing:  OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) 
                      -- Searching for sasl/sasl.h
                      --   Not found (specify -DCMAKE_INCLUDE_PATH=/path/to/sasl/include for SASL support)
                      -- Searching for libsasl2
                      --   Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/sasl/lib for SASL support)
                      -- Check size of socklen_t
                      -- Check size of socklen_t - done
                      -- Looking for res_nsearch
                      -- Looking for res_nsearch - not found
                      -- Looking for res_search
                      -- Looking for res_search - found
                      -- Looking for sched_getcpu
                      -- Looking for sched_getcpu - not found
                      -- Detected parameters: accept (int, struct sockaddr *, socklen_t *)
                      -- Searching for compression library header snappy-c.h
                      --   Not found (specify -DCMAKE_INCLUDE_PATH=/path/to/snappy/include for Snappy compression)
                      -- No ICU library found, SASLPrep disabled for SCRAM-SHA-256 authentication.
                      -- If ICU is installed in a non-standard directory, define ICU_ROOT as the ICU installation path.
                      -- SSL disabled
                      -- SASL disabled
                      -- Configuring done
                      -- Generating done
                      -- Build files have been written to: /home/franki/apps/qt/mongo-c-driver
                      

                      Any idea how to solve this problem?

                      Best,
                      Marek

                      M Offline
                      M Offline
                      Marek
                      wrote on last edited by
                      #10

                      Maybe this is not good idea but I have added:

                      #include <stdio.h>
                      #undef stderr
                      FILE *stderr = NULL;
                      

                      to bson.c and now I get rid of undefined stderr
                      When I set in CMakeList.txt in libbson

                      set (BSON_HAVE_RAND_R 0)
                      

                      There are different errors:

                      /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:303: error: undefined reference to 'srand'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:230: error: undefined reference to 'rand'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:230: error: undefined reference to 'rand'
                      /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:230: error: undefined reference to 'rand'
                      

                      So something is not linking properly for Android.

                      M 1 Reply Last reply
                      0
                      • M Marek

                        Maybe this is not good idea but I have added:

                        #include <stdio.h>
                        #undef stderr
                        FILE *stderr = NULL;
                        

                        to bson.c and now I get rid of undefined stderr
                        When I set in CMakeList.txt in libbson

                        set (BSON_HAVE_RAND_R 0)
                        

                        There are different errors:

                        /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:303: error: undefined reference to 'srand'
                        /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:230: error: undefined reference to 'rand'
                        /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:230: error: undefined reference to 'rand'
                        /opt/mongo-c-driver/src/libbson/src/bson/bson-context.c:230: error: undefined reference to 'rand'
                        

                        So something is not linking properly for Android.

                        M Offline
                        M Offline
                        Marek
                        wrote on last edited by
                        #11

                        I have also commented out rand_r and set current_time as result from rand_r, for now.
                        I assume I need to report problem to mongoDb.

                        Best,
                        Marek

                        1 Reply Last reply
                        2
                        • M Offline
                          M Offline
                          Morbius
                          wrote on last edited by
                          #12

                          I also tried the JSON for Modern C++ . I thought I wanted BSON, but after looking at all the wasted space in the resultant binary file, I tried CBOR, but too wasted too much space. MessagePack turned out to be nicely compact. I had a minor mysterious error if I created it with an initializer list, and then tried to assign a new datum via a string index, e.g.:

                          j["foo"] = "bar";
                          

                          It turns out it must be one or the other. It is well-maintained and up to date. I found it easier to use the one big include. I would use an official MessagePack API, but the vanilla C++ one requires Boost++ also, and there are about six other APIs which only use MessagePack output format. This one can use multiple output formats. I might use QJsonObject, but the lack of support for storing binaries as binary was a non-starter; and the much more compact format of MessagePack, without a CPU-expensive re-encoding of binary format was a winner for me. I hope in the future, QJsonObject will support MessagePack and non-reencoded binary fields.

                          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