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
Forum Updated to NodeBB v4.3 + New Features

Qt with BSON

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 3 Posters 2.5k 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.
  • 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